Python 如何重定向cron脚本的完整输出
我每天18:35有一个简单的cronjob运行:Python 如何重定向cron脚本的完整输出,python,shell,cron,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中看到回显文本。如何将shell脚本的完整输出重定向
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中看到回显文本。如何将shell脚本的完整输出重定向到~/job.log?您是否尝试过
~/job.sh&>~/job.log
?您需要重定向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的末尾。
而不是原始输出流。”
Arkaitz有最简单的解决方案。但是,要查看您的代码片段有什么问题,我们需要进入bash手册: 请注意,重定向的顺序很重要。例如 命令
ls > dirlist 2>&1
将标准输出和标准错误定向到文件目录列表,
当命令
ls > dirlist 2>&1
ls 2>&1 > dirlist
仅将标准输出定向到文件目录列表,因为标准
在标准输出之前,从标准输出复制了错误
put已重定向到目录列表
显然,输出重定向只重定向到另一个流的目标,而不是另一个流本身。当bash解析命令行时,它将出现2>&1
子句,并将stderr
重定向到stdout
的目标,此时它仍然是控制台(或连接到cron
的stdout
)。只有在此之后,stdout
才会被重定向
所以你真正想要的是:
05 18 * * * ~/job.sh >>~/job.log 2>&1
我很确定这在一般情况下应该是有效的。当您使用shell重定向时,操作系统会更改标准输出文件描述符 但是,如果Python脚本本身直接写入屏幕(可能通过打开/dev/tty),它将不会被捕获到log.txt中。是这样吗?即使是一个简单的python程序,它也会失败吗
print "Hello"
?这适用于python脚本,但不是一个很好的解决方案,因为需要在python脚本和cronjob中指定日志的文件名。此外,如果我需要重定向“job.sh”中的其他命令的输出(假设其中有一个“git commit-a-m'auto commit'),这也没有帮助。&>>根本不产生任何输出。&>生成正确的输出。但是,它不会追加,而是覆盖!我怎么能让它将新的输出附加到旧的内容中呢?它确实会附加到文件中。是的,即使是一个简单的python脚本,除了这个打印行,也不会写入日志。问题是重定向的顺序(见wds的答案)。@musicinmybrain:不太可能,几天前我遇到了完全相同的问题。:-)