Lost redirecting stderr & stdout to 3 files - one each plus combined


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Lost redirecting stderr & stdout to 3 files - one each plus combined
# 1  
Old 01-02-2018
Lost redirecting stderr & stdout to 3 files - one each plus combined

Hi folks

I need/want to redirect output (stdout, stderr) from an exec call to separate files. One for stderr only and two(!) different (!) ones for the combined output of stderr and stdout.

After some research and testing i got this so far :

Code:
(( exec ${command} ${command_parameters} 3>&1 1>&2 2>&3 ) | tee -a ${FILE_LOG_TEMPORARY}.stderr ) >> ${FILE_LOG_TEMPORARY} 2>&1

So got my stderr and one stdout+stderr log files and only need a "copy" of FILE_LOG_TEMPORARY, sort of
Code:
(( exec ${command} ${command_parameters} 3>&1 1>&2  2>&3 ) | tee -a ${FILE_LOG_TEMPORARY}.stderr ) >>  ${FILE_LOG_TEMPORARY} 2>&1 | tee -a ${FILE_LOG_GLOBAL}

But lot's of monochrome '&'s, '>'s and 'tee's that are enganged in some sort of high speed rain dance in front of my eyes are keeping me from seeing the solution right now. 8-)

And yes, simply copying the file after exec finished is Plan B...
Plan A is to have (many) ${command}s log into a global file (for tail -f'ing) and single files for run control/archiving.

To make matters worse i need to run the script on Solaris(ksh88, which wont accept my "solution" above so far), SuSE (ksh93) and Redhat (ksh93).

Cheers and thanks for all hints!

Michael
# 2  
Old 01-02-2018
Pipelines only connect stdout to stdin of the next command and do nothing for stderr or other file descriptors. So tee will only receive stdout of the first command and fiddling with file descriptors can only be used to combine them into stdout if you want their information to be used on the other side of the pipe.

Quote:
2.9.2 Pipelines

A pipeline is a sequence of one or more commands separated by the control operator '|'. The standard output of all but the last command shall be connected to the standard input of the next command.

The format for a pipeline is:

[!] command1 [ | command2 ...]
The standard output of command1 shall be connected to the standard input of command2. The standard input, standard output, or both of a command shall be considered to be assigned by the pipeline before any redirection specified by redirection operators that are part of the command (see Redirection).
Shell Command Language
This User Gave Thanks to Scrutinizer For This Post:
# 3  
Old 01-02-2018
For Solaris 10 onward you have bash as part of the standard distribution. ksh88 is a good shell but bash has some better features for this kind of project. SuSe and RH both use bash by default. ksh on those two machines is really dash - dash is supposed to be 98% ksh compliant - but in fact you are likely introducing another level unneeded complexity. Please consider the project in a single shell seriously.

Following on Scrutinizer's good answer:

What you really should consider is some sort of job scheduler that can track a bunch of processes and their outputs for you. IMO, you are going to have to tinker with this setup from now on into the future. So, if you need an ongoing hobby this is one way to create one.

If you let us know your OS versions maybe we can make some suggestions. Also software like nagios can keep track of many multiple logs simultaneously. Without all the extra file fiddling you are working on.
This User Gave Thanks to jim mcnamara For This Post:
# 4  
Old 01-02-2018
The >> redirects descriptor 1 to the file, so there is nothing left for the following | tee
I think you want
Code:
(( exec ${command} ${command_parameters} 3>&1 1>&2  2>&3 ) | tee -a ${FILE_LOG_TEMPORARY}.stderr ) 2>&1 | tee -a  ${FILE_LOG_TEMPORARY} >> ${FILE_LOG_GLOBAL}

BTW you do not need the total swap of descriptors 1 and 2; you can use (and define) descriptor 3 outside the ( ) brackets. Left as an exercise.
This User Gave Thanks to MadeInGermany For This Post:
# 5  
Old 01-02-2018
For instance can a simple example help :
Code:
exec ${command} ${command_parameters} 1>> my._$(date +%s)_$$.log 2>> my._$(date +%s)_$$.err

Can you specify your problem to more detail ?
What do you want to achieve by redirecting all the output to log file(s) ?
Is exec really required ?


Hope the helps
Regards
Peasant.
This User Gave Thanks to Peasant For This Post:
# 6  
Old 01-03-2018
Do I get it right: you want three files, one for stdout, one for stderr, and one to capture both in one single file? Would this do what you want:
Code:
{ { ls -la file fie | tee log1; } 2>&1 >&3 | tee log2 >&3; } 3>log3
cat log*
log1:
-rw-rw-r-- 1 user group 108 Dez 27 15:26 file
log2:
ls: cannot access 'fie': No such file or directory
log3:
ls: cannot access 'fie': No such file or directory
-rw-rw-r-- 1 user group 108 Dez 27 15:26 file

This User Gave Thanks to RudiC For This Post:
# 7  
Old 01-30-2018
Solved

Hi Folks

Thanks all for the quick replies and sorry for my late response. Healthwise 2018 isn't my year exactly....

Decided to follow RudiCs suggestion and switch to bash which works fine.

What we originally wanted to do : Put cronjobs into a wrapper script and use redirected outputs for centnalized logging, archiving, alarming

Details :
1. log : stderr only
Icinga (Nagios) will check for stderr log files. Log files individual for each cronjob.

2. log : stdout & stderr
Additionaly we'll create a local central log file - independet of what the individual cronjob logs or rather does not log.
All cronjobs of a server will log into that file, simultaniously.
As we got a lots of different cronjobs that (may) produce, or rather **** into stdout/stderr, that file will certainly become messy.
It's rather just for tail -f'ing if you're on the system and want to look at things going on.

3. log : stdout & stderr
We'll also archive sdtout & stderr - per single cronjob.


Wrapped crontab entry wil look like this


* 1 * * * WrapperScript.bash UniqueJobID Timeout OriginalCommand OriginalParameters



And yes, we looked at already available solutions but didn't find anything that wasn't over the top in size, complexity or cost for our limited purpose.

However, if you plan on doing something similar start here 8-) :
Job scheduler - Wikipedia

Thanks again all for your help!


Moderator's Comments:
Mod Comment Please use appropriate language as required by forum rules!

Last edited by RudiC; 01-30-2018 at 06:55 AM.. Reason: removed profanities...
This User Gave Thanks to MDominok For This Post:
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

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

3. Shell Programming and Scripting

Prepend TimeStamp to STDERR & STDOUT to a file

Currently I am redirecting STDERR and STDOUT to a log file by doing the following { My KSH script contents } 2>&1 | $DEBUGLOG Problem is the STDERR & STDOUT do not have any date/time associated. I want this to be something that i can embed into a script opposed to an argument I use... (4 Replies)
Discussion started by: nitrobass24
4 Replies

4. 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

5. Solaris

Handling Stdout&StdErr for background jobs.

Hello Friends, sorry, i am not very familiar with Unix programming. Could you please help me on this? We have to start different components from a startup script. each components are started as below in the background in a startprocess function $nohup $file $args >>$logFile 2>&1 & ... (1 Reply)
Discussion started by: alvinbush
1 Replies

6. Shell Programming and Scripting

Handling Stdout&StdErr for background jobs.

Hello Friends, sorry, i am not very familiar with Unix programming. Could you please help me on this? We have to start different components from a startup script. each components are started as below in the background in a startprocess function $nohup $file $args >>$logFile 2>&1 & ... (0 Replies)
Discussion started by: alvinbush
0 Replies

7. Shell Programming and Scripting

Redirecting STDERR message to STDOUT & file at same time

Friends I have to redirect STDERR messages both to screen and also capture the same in a file. 2 > &1 | tee file works but it also displays the non error messages to file, while i only need error messages. Can anyone help?? (10 Replies)
Discussion started by: vikashtulsiyan
10 Replies

8. UNIX for Advanced & Expert Users

combined stdout & stderr

Hello Everyone! I'm trying to combine output for standard output and for possible standard error to the log file. I was trying to use tee command, but it turned out if error occurred error output will be send to the screen only and will not be redirected with tee command to the log file. Anyone... (11 Replies)
Discussion started by: slavam
11 Replies

9. Shell Programming and Scripting

redirecting STDOUT & STDERR

In bash, I need to send the STDOUT and STDERR from a command to one file, and then just STDERR to another file. Doing one or the other using redirects is easy, but trying to do both at once is a bit tricky. Anyone have any ideas? (9 Replies)
Discussion started by: jshinaman
9 Replies

10. Shell Programming and Scripting

stderr & stdout to a file and the right exit code

Hi all, I need to redirect stdout and stderr to a file in a ksh shell. That's not a problem. But I need also the correct exit code for the executed command. In the example below I redirect correctly the stdout & stderr to a file, but I have the exit code of tee command and not for the mv... (2 Replies)
Discussion started by: up69
2 Replies
Login or Register to Ask a Question