【问题标题】:In Linux crontab, stderr of my program must be redirected, why?在Linux crontab中,我的程序的stderr必须重定向,为什么?
【发布时间】:2012-04-24 07:16:26
【问题描述】:

我写了一个程序,可以输出到stderr。当我通过 Linux crontab 运行它时,我必须重定向 stderr。如果没有,程序将以SIGPIPE 退出。为什么?

不行

45 10 * * * /home/sandy/test > /home/sandy/test.log &

好的

45 10 * * * /home/sandy/test > /home/sandy/test.log 2>&1 &

【问题讨论】:

  • 不应该。你能发布你的程序吗?检查@Lars Kotthoff 的回复。

标签: linux crontab stderr sigpipe


【解决方案1】:

您正在后台运行该命令(最后是&)。这意味着 cron 已开始运行命令的 shell 不会等待其完成并在命令启动后立即终止。如果您的程序现在尝试写入stderr,则没有任何内容连接到读取端并且您会得到一个 SIGPIPE。如果您重定向到文件,则不会发生这种情况,因为正在运行的进程知道要写入的位置。

解决此问题的另一种方法是在前台运行命令,即末尾没有&。无论如何,这是更好的做法。

【讨论】:

  • 这篇文章很棒。我觉得我应该知道这一点,但我没有。 Perl 返回 255,我只是想通了原因——它在 cron 中运行,并且正在使用 warn
【解决方案2】:

SIGPIPE 在尝试写入管道(或套接字)时被发送到进程 其阅读端已关闭。 cron 通常会尝试发送 stdoutstderr 的输出 通过电子邮件指定的命令,除非它被重定向。这是 可以想象,在您的机器上没有设置本地电子邮件传递 正确并且由 cron 启动的电子邮件程序通过电子邮件将stderr 发送给您 在/home/sandy/test 仍在运行时死亡,导致管道破裂。

答案来自herehere

【讨论】:

    猜你喜欢
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多