【问题标题】:How to redirect complete output of a cron script如何重定向 cron 脚本的完整输出
【发布时间】:2010-12-25 15:34:20
【问题描述】:

我每天 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 脚本的 complete 输出重定向到 ~/job.log?

【问题讨论】:

    标签: python shell cron


    【解决方案1】:

    Arkaitz 有最简单的解决方案。但是,要查看您的 sn-p 有什么问题,我们需要查看 bash 手册:

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

      ls > dirlist 2>&1
    

    将标准输出和标准错误都指向文件目录列表, 而命令

     ls 2>&1 > dirlist
    

    仅将标准输出定向到文件 dirlist,因为标准 在标准输出之前从标准输出中复制了错误 put 被重定向到目录列表。

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

    所以你真正想要的是:

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

    【讨论】:

    • @musicinmybrain:不是真的,几天前我遇到了完全相同的问题。 :-)
    【解决方案2】:

    你试过~/job.sh &>> ~/job.log吗?

    【讨论】:

    • &>> 根本不产生任何输出。 &> 产生正确的输出。但是,它不会附加,它会覆盖!如何让它将新输出附加到旧内容?
    • 它确实附加到文件中
    【解决方案3】:

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

    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. 的末尾原始输出流。”

    【讨论】:

    • 这适用于 python 脚本,但不是那么优雅的解决方案,因为需要在 python 脚本和 cronjob 中指定日志的文件名。另外,如果我需要重定向“job.sh”中其他命令的输出(比如其中有一个“git commit -a -m 'auto-commit'”),这将无济于事。
    【解决方案4】:

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

    但是,如果您的 Python 脚本本身直接写入屏幕(可能通过打开 /dev/tty),它不会被捕获到您的 log.txt 中。是这样吗?即使对于一个简单的python程序来说它也会失败

    print "Hello"
    

    ?

    【讨论】:

    • 是的,即使是一个只有这个打印行的简单 python 脚本也不会写入日志。问题在于重定向的顺序(参见 wds 的回答)。
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    相关资源
    最近更新 更多