Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何重定向cron脚本的完整输出_Python_Shell_Cron - Fatal编程技术网

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

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脚本的完整输出重定向

我每天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脚本的完整输出重定向到~/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:不太可能,几天前我遇到了完全相同的问题。:-)