Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to redirect complete output of a cron script

Tags:

python

shell

cron

I have a simple cronjob running every day at 18:35:

05 18 * * * ~/job.sh 2>&1 >> ~/job.log

So the output of ~/job.sh should be written into ~/job.log. In job.sh, there are some echo commands and a few python scripts are executed, e.g.:

echo 'doing xyz'
python doXYZ.py

Now, whatever output the python scripts produce, they are not written into ~/job.log. I only see the echo text in ~/job.log. How can I redirect the complete output of the shell script to ~/job.log?

like image 844
pruefsumme Avatar asked Dec 11 '09 12:12

pruefsumme


2 Answers

Arkaitz has the simplest solution. However, to see what's wrong with your snippet we need to go into the bash manual:

Note that the order of redirections is significant. For example, the command

  ls > dirlist 2>&1

directs both standard output and standard error to the file dirlist, while the command

 ls 2>&1 > dirlist

directs only the standard output to file dirlist, because the standard error was duplicated from the standard output before the standard out‐ put was redirected to dirlist.

So apparently the output redirection only redirects to the target of the other stream, not to the other stream itself. When bash parses your command line it will come upon the 2>&1 clause and redirect stderr to the target of stdout, which at this point is still the console (or whatever is attached to cron's stdout). Only after this will stdout be redirected.

So what you really want is:

05 18 * * * ~/job.sh >>~/job.log 2>&1
like image 127
wds Avatar answered Oct 16 '22 17:10

wds


Have you tried ~/job.sh &>> ~/job.log ?

like image 44
Arkaitz Jimenez Avatar answered Oct 16 '22 18:10

Arkaitz Jimenez