Find centralized, trusted content and collaborate around the technologies you use most.
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
我写了一个程序,可以输出到stderr. 当我通过 Linux 运行它时crontab,我必须重定向stderr. 如果没有,程序将以SIGPIPE. 为什么?
stderr
crontab
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 启动的电子邮件程序stderr向您发送电子邮件,但仍在运行时死/home/sandy/test了,导致管道损坏。
stdout
/home/sandy/test
来自这里和这里的答案