在Linux crontab中,我的程序的stderr必须redirect,为什么?

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

不好

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

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

你在后台运行命令( &在最后)。 这意味着cron已经开始运行该命令的shell将不会等待其完成,并在命令启动后立即终止。 如果你的程序现在试图写stderr ,没有任何东西连接到读端,你会得到一个SIGPIPE。 如果您重定向到一个文件,这不会发生,因为正在运行的进程知道在哪里写入。

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

SIGPIPE试图写入一个管道(或套接字)的读取结束被关闭,它将被发送到一个进程。 cron通常会尝试通过电子邮件发送指定命令的stdoutstderr输出,除非被重定向。 可以想象,在您的机器上,本地电子邮件传送设置不正确,并且由cron启动的电子邮件程序通过电子邮件发送给您,但是/home/sandy/test仍在运行,导致断开的管道。

答案来自这里和这里