nohup/supervise 命令的日志重定向问题
Issue with log redirection with nohup/supervise command
我们有一个node项目,用nohup配合supervision来监督node服务器。我们使用的命令是:
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>>被误改成了1>>。 Post 这一变化,我们开始注意到我们的 api 变慢了。一些理想情况下可以在不到 2 秒内完成的 API 需要 2-4 分钟才能完成。我们使用二进制搜索来缩小错误提交的范围并将其还原。恢复此更改后,一切开始正常运行。虽然这个错误的提交在生产中,但我们看到了很多 EPIPE 错误:
Error: write EPIPE
at exports._errnoException (util.js:856:11)
at WriteWrap.afterWrite (net.js:767:14)
还原此更改后,没有 EPIPE 错误。我确信这个 EPIPE 错误与上面提到的错误提交有某种联系。谁能帮我理解这里发生了什么。
PS:我知道 2
和 1
分别是 stderr
和 stdout
的文件描述符。
在您所说的 "buggy commit" 之后,这是您所拥有的:
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
上阅读更多相关信息
我们有一个node项目,用nohup配合supervision来监督node服务器。我们使用的命令是:
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>>被误改成了1>>。 Post 这一变化,我们开始注意到我们的 api 变慢了。一些理想情况下可以在不到 2 秒内完成的 API 需要 2-4 分钟才能完成。我们使用二进制搜索来缩小错误提交的范围并将其还原。恢复此更改后,一切开始正常运行。虽然这个错误的提交在生产中,但我们看到了很多 EPIPE 错误:
Error: write EPIPE
at exports._errnoException (util.js:856:11)
at WriteWrap.afterWrite (net.js:767:14)
还原此更改后,没有 EPIPE 错误。我确信这个 EPIPE 错误与上面提到的错误提交有某种联系。谁能帮我理解这里发生了什么。
PS:我知道 2
和 1
分别是 stderr
和 stdout
的文件描述符。
在您所说的 "buggy commit" 之后,这是您所拥有的:
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
上阅读更多相关信息