4

我写了一个程序,可以输出到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 &
4

2 回答 2

4

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

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

于 2012-04-24T07:36:13.907 回答
1

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

来自这里这里的答案

于 2012-04-24T07:35:19.867 回答