【问题标题】:Issue with log redirection with nohup/supervise command使用 nohup/supervise 命令进行日志重定向的问题
【发布时间】:2017-01-07 16:45:02
【问题描述】:

我们有一个node项目,使用和supervise来监督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>>。发布此更改后,我们开始注意到我们的 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:我知道21 分别是stderrstdout 的文件描述符。

【问题讨论】:

  • 它看起来像并发写入日志文件发生的地方。如果您真的想确定并在这里得到真正的答案,您应该尝试重现错误并在此处发布“如何做”。
  • @J.Chomel 你能解释一下为什么你说由于提交错误而发生并发写入吗?

标签: nohup node.js linux unix nohup epipe


【解决方案1】:

在您所说的“错误提交”之后,这就是您所拥有的:

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了解更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2012-12-18
    • 1970-01-01
    相关资源
    最近更新 更多