如何重定向cron脚本的完整输出

时间:2009-12-11 12:01:11

标签: python shell cron

我每天都在18:35运行一个简单的cronjob:

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

所以〜/ job.sh的输出应写入〜/ job.log。在job.sh中,有一些echo命令和一些python脚本被执行,例如:

echo 'doing xyz'
python doXYZ.py

现在,无论python脚本产生什么输出,它们都不会写入〜/ job.log。我只在〜/ job.log中看到echo文本。如何将shell脚本的完整输出重定向到〜/ job.log?

4 个答案:

答案 0 :(得分:16)

Arkaitz有最简单的解决方案。但是,要查看您的代码段有什么问题,我们需要进入bash手册:

  

请注意,重定向的顺序非常重要。例如,   命令

  ls > dirlist 2>&1
     

将标准输出和标准错误都指向文件dirlist,   而命令

 ls 2>&1 > dirlist
     

仅将标准输出指向文件dirlist,因为标准   错误在标准输出之前从标准输出重复   put被重定向到了dirlist。

显然,输出重定向仅重定向到另一个流的目标,而不是重定向到另一个流本身。当bash解析你的命令行时,它会出现2>&1子句并将stderr重定向到stdout的目标,此时此目标仍然是控制台(或cron附加的任何内容1}}的{​​{1}})。只有在此之后才会重定向stdout

所以你真正想要的是:

stdout

答案 1 :(得分:4)

您是否尝试过~/job.sh &>> ~/job.log

答案 2 :(得分:2)

您需要重定向python脚本的输出。学习Python第二版建议如下:

import sys
sys.stdout = open('log.txt', 'a')   # Redirects output to file
...
print x, y, x                       # shows up in log.txt

继续说:

  

“在这里,我们将sys.stdout重置为以追加模式打开的手动打开的输出文件对象。重置后,程序中任何位置的每个print语句都会将其文本写入文件末尾log.txt.代替原始输出流。“

答案 3 :(得分:1)

我很确定这应该适用于一般情况。使用shell重定向时,操作系统会更改stdout文件描述符。

但是,如果你的Python脚本本身直接写入屏幕(可能是通过打开/ dev / tty),它将不会被你的log.txt捕获。是这样的吗?即使是一个只做

的简单python程序,它也会失败吗?
print "Hello"