我写了一个程序,可以输出到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通常会尝试通过电子邮件发送指定命令的stdout
和stderr
输出,除非被重定向。 可以想象,在您的机器上,本地电子邮件传送设置不正确,并且由cron启动的电子邮件程序通过电子邮件发送给您,但是/home/sandy/test
仍在运行,导致断开的管道。
答案来自这里和这里