使用nohup / supervise命令进行日志重定向问题

时间:2016-08-31 07:51:32

标签: node.js linux unix nohup epipe

我们有一个节点项目并使用监督节点服务器。我们使用的命令是:

nohup supervise /usr/share/$PACKAGE/superviseRun/supervise$NODE_PORT >> /var/log/<company_name>/sp-sms/$PACKAGE/supervise$NODE_PORT-$(date +"%d-%m-%y").log 2>> /var/log/<company_name>/sp-sms/$PACKAGE/supervise$NODE_PORT-$(date +"%d-%m-%y").log &

这个命令已经在生产中存在了3年。最近有人将上述命令改为:

nohup supervise /usr/share/$PACKAGE/superviseRun/supervise$NODE_PORT >> /var/log/<company_name>/sp-sms/$PACKAGE/supervise$NODE_PORT-$(date +"%d-%m-%y").log 1>> /var/log/<company_name>/sp-sms/$PACKAGE/supervise$NODE_PORT-$(date +"%d-%m-%y").log &

基本上 2&gt;&gt; 错误地更改为 1&gt;&gt; 。发布此更改后,我们开始注意到api的缓慢。理想情况下,在2秒内完成的一些apis需要2-4分钟才能完成。我们使用二进制搜索来缩小错误提交并将其还原。在恢复这一变化后,事情开始正常。虽然这个错误提交正在生产中,但我们看到了很多EPIPE错误:

Error: write EPIPE
    at exports._errnoException (util.js:856:11)
    at WriteWrap.afterWrite (net.js:767:14)

在恢复此更改后,没有EPIPE错误。我确定这个EPIPE错误以某种方式连接到上面提到的错误提交。有人可以帮我理解这里发生了什么。

PS:我知道2&amp; 1分别是stderrstdout的文件描述符。

1 个答案:

答案 0 :(得分:0)

在你正在谈论的“错误提交”之后,这就是你所拥有的:

nohup supervise /usr/share/$PACKAGE/superviseRun/supervise$NODE_PORT \
 >> /var/log/<company_name>/sp-sms/$PACKAGE/supervise$NODE_PORT-$(date +"%d-%m-%y").log \
1>> /var/log/<company_name>/sp-sms/$PACKAGE/supervise$NODE_PORT-$(date +"%d-%m-%y").log &

这意味着您的程序同时向同一个文件写入两次。这是未定义的行为。在某些情况下,它可能会奏效。在其他情况下,您的系统可能会打开相同文件的两倍,然后从一只手(多线程)写入并关闭文件,然后另一只手将尝试写入已关闭的文件。它还取决于您的程序如何处理SIGPIPE

https://unix.stackexchange.com/questions/84813/what-makes-a-unix-process-die-with-broken-pipe

上详细了解此信息