我每天都在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?
答案 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
重置为以追加模式打开的手动打开的输出文件对象。重置后,程序中任何位置的每个log.txt.
代替原始输出流。“
答案 3 :(得分:1)
我很确定这应该适用于一般情况。使用shell重定向时,操作系统会更改stdout文件描述符。
但是,如果你的Python脚本本身直接写入屏幕(可能是通过打开/ dev / tty),它将不会被你的log.txt捕获。是这样的吗?即使是一个只做
的简单python程序,它也会失败吗?print "Hello"