redirect stdout and stderr to file wrong order problem with subshell


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting redirect stdout and stderr to file wrong order problem with subshell
# 1  
Old 04-13-2011
redirect stdout and stderr to file wrong order problem with subshell

Hello

I read a lot of post related to this topic, but nothing helped me. Smilie

I'm running a ksh script with subshell what processing some ldap command. I need to check output for possible errors.

Code:
#!/bin/ksh
...
readinput < $QCHAT_INPUT |&
 while read -p line
 do
   echo  $line
    ...
 fi
 done | ldapadd -x -h $HOST  -p $PORT -D cn=$USER -w $PASSWD -c

sttout output:

adding new entry "qchatUserId=21999013000010,ran=cdma,key=qchatUserIdNewTest,o=sprintpcs,o=sprintpcs.com"
ldap_add: Already exists (68)


adding new entry "qchatUserId=000000mig1,ran=cdma,key=qchatUserIdNewTest,o=sprintpcs,o=sprintpcs.com"
ldap_add: Already exists (68)


ldapadd: invalid format (line 1) entry: ""



I would like to have the same output in the file.

I tried such redirecting:
Code:
done | ( ldapadd -x -h $HOST -p $PORT -D cn=$USER -w $PASSWD -c 2>&3  1>&3 ) 3>log



Code:
done | (ldapadd -x -h $HOST -p $PORT -D cn=$USER -w  $PASSWD -c 2>&1) | tee log



Code:
done | ldapadd -x -h $HOST -p $PORT -D cn=$USER -w  $PASSWD -c > log 2>&1



All have the same useless output:

$ cat log


ldap_add: Already exists (68)
ldap_add: Already exists (68)
ldapadd: invalid format (line 1) entry: ""
adding new entry "qchatUserId=21999013000010,ran=cdma,key=qchatUserIdNewTest,o=sprintpcs,o=sprintpcs.com"


adding new entry "qchatUserId=000000mig1,ran=cdma,key=qchatUserIdNewTest,o=sprintpcs,o=sprintpcs.com"

I red that stdout is buffered and stderr not. But none solutions were working.

So is there a way how to force correct order in the file?
out1
err1
out2
err2
out3
# 2  
Old 04-13-2011
No amount of redirection tricks are going to change the order in which the program prints things. I'm afraid my prev solution doesn't work since I slightly misunderstood the problem -- ldap runs all at once, not once for each individual line.

Which might be how you have to do it: run ldap once for each individual statement, instead of one big batch, so you can guarantee everything's done and printed every time ldap finishes one statement. Save its stdout and stderr into temp files then cat them in the order you want.

Last edited by Corona688; 04-13-2011 at 04:35 PM..
# 3  
Old 04-14-2011
Thanks for try.

I still don't understand why it the order in the output is correct when it is send to /dev/tty.

I found a way how to store it to the file. To start script command

Code:
>script
>./check.sh
>exit
>cat typescript
Instance 00. Processing input : qchatUserIdAliasList.txt00. Start check old alias and add new alias
adding new entry "qchatUserId=21999013000010,ran=cdma,key=qchatUserIdNewTest,o=sprintpcs,o=sprintpcs.com"
ldap_add: Already exists (68)

adding new entry "qchatUserId=000000mig1,ran=cdma,key=qchatUserIdNewTest,o=sprintpcs,o=sprintpcs.com"
ldap_add: Already exists (68)

end

To run it from command line:
Code:
>script -c ./check.sh -a log

Finally I have what I need, it took me 2 days. But I still like my shell Smilie

Last edited by Osim; 04-14-2011 at 08:03 AM..
# 4  
Old 04-14-2011
Quote:
Originally Posted by Osim
Thanks for try.

I still don't understand why it the order in the output is correct when it is send to /dev/tty.
Well, some programs check when they're attached to a tty and change their behavior. So it may see that you're not on a tty and not bother flushing its output for efficiency. I think (but aren't positive) that script uses a PTY to convince things its a terminal...

Last edited by Corona688; 04-14-2011 at 01:09 PM..
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Redirect STDOUT & STDERR to file and then on screen

Dear all, redirecting STDOUT & STDERR to file is quite simple, I'm currently using: Code: exec 1>>/tmp/tmp.log; exec 2>>/tmp/tmp.log But during script execution I would like the output come back again to screen, how to do that? Thanks Luc edit by bakunin: please use CODE-tags like the... (6 Replies)
Discussion started by: tmonk1
6 Replies

2. Shell Programming and Scripting

Have each subshell write stderr and stdout to its own logfile

Hello, As stated in the title, I do some hacked parallel processing by running multiple instances of bash scripts, each in their own subshell. The code looks like this, # launch one batch-train script in background for each value in fold group list for FOLD_GROUP in "${FOLD_GROUP_LIST}" do ... (5 Replies)
Discussion started by: LMHmedchem
5 Replies

3. Shell Programming and Scripting

Redirect STDOUT & STDERR to file and then on screen

Dear all, redirecting STDOUT & STDERR to file is quite simple, I'm currently using: exec 1>>/tmp/tmp.log; exec 2>>/tmp/tmp.logBut during script execution I would like the output come back again to screen, how to do that? Thanks Lucas (4 Replies)
Discussion started by: Lord Spectre
4 Replies

4. Red Hat

Redirect STDOUT and STDERR of chsh

EDIT: Nevermind, figured it out! Forgot to put backslashes in my perl script to not process literals! Hi everyone. I am trying to have this command pass silently. (no output) chsh -s /bin/sh news Currently it outputs. I've tried.... &> /dev/null 1> /dev/null 2>&1 /dev/null 1>&2... (1 Reply)
Discussion started by: austinharris43
1 Replies

5. Shell Programming and Scripting

redirect STDOUT to a file in a subshell

Hi, I would like to avoid re-directing line by line to a file. What is the best way to re-direct STDOUT to a file in a subshell? Thanks in advance. Cheers Vj (1 Reply)
Discussion started by: tnvee
1 Replies

6. Shell Programming and Scripting

Preserve output order when redirecting stdout and stderr

Hi, I already searched through the forum and tried to find a answer for my problem but I didn't found a full working solution, thats way I start this new thread and hope, some can help out. I wonder that I'm not able to find a working solution for the following scenario: Working in bash I... (8 Replies)
Discussion started by: Boemm
8 Replies

7. Shell Programming and Scripting

Redirect stdout/stderr to a file globally

Hi I am not if this is possible: is it possible in bach (or another shell) to redirect GLOBALLY the stdout/stderr channels to a file. So, if I have a script script.sh cmd1 cmd2 cmd3 I want all stdout/stderr goes to a file. I know I can do: ./script.sh 1>file 2>&1 OR ... (2 Replies)
Discussion started by: islegmar
2 Replies

8. Shell Programming and Scripting

How to redirect stderr and stdout to a file

Hi friends I am facing one problem while redirecting the out of the stderr and stdout to a file let example my problem with a simple example I have a file (say test.sh)in which i run 2 command in the background ps -ef & ls & and now i am run this file and redirect the output to a file... (8 Replies)
Discussion started by: sushantnirwan
8 Replies

9. UNIX for Dummies Questions & Answers

redirect stderr and/or stdout to /dev/null from command line

Is it possible to redirect errors at the command line when you run the script such as bash scriptname & 2>/dev/null? (1 Reply)
Discussion started by: knc9233
1 Replies

10. Shell Programming and Scripting

Redirect stdout and stderr

How can I redirect and append stdout and stderr to a file when using cron? Here is my crontab file: */5 * * * * /dir/php /dir/process_fns.php >>& /dir/dump.txt Cron gives me an 'unexpected character found in line' when trying to add my crontab file. Regards, Zach Curtis POPULUS (8 Replies)
Discussion started by: zcurtis
8 Replies
Login or Register to Ask a Question