【问题标题】:How to detect restart of the app by Forever module如何通过 Forever 模块检测应用程序的重启
【发布时间】:2014-01-09 10:25:31
【问题描述】:

我有一个带有集群和 Forever 的应用程序。我想在关闭或重新启动应用程序之前保存来自工作人员的信息。所以我使用 process.on('SIGINT') 并且它适用于 CTRL+C。

但我一直坚持下去。是否有可能检测到应用程序以某种方式被 Forever 重新启动?有什么信号吗?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    这个问题已经很老了,但是对于那些没有看到它的人来说,最新的永久版本支持 --killSignal(已在 2013 年 12 月添加),因此您可以通过示例使用 --killSignal=SIGUSR2 并使用 @ 捕获此信号987654322@

    【讨论】:

      【解决方案2】:

      永远使用 SIGKILL 见 https://github.com/nodejitsu/forever-monitor/blob/master/lib/forever-monitor/monitor.js#L353

      所以将process.on('SIGKILL', onStop); 添加到您的process.on('SIGINT', onStop); 中,但请注意,此后将永远使用kill https://github.com/nodejitsu/forever-monitor/blob/master/lib/forever-monitor/common.js#L45,它发送一个“SIGTERM”,所以process.on('SIGTERM', onStop) 也是如此。

      【讨论】:

      • SIGKILL 无法被进程捕获。如果你在 Node 中尝试,你会得到一个EINVAL 错误。
      【解决方案3】:

      我建议在重新启动您的守护程序之前执行kill -s SIGUSR1 <pid>。这个信号很容易被process.on('SIGUSR1')在节点中捕获。

      kill -s SIGUSR1 <pid>
      forever restart test.js
      

      【讨论】:

      • 如果没有时间进行适当的清理,那么在 sigkill 之前发送 sigusr 有什么意义?
      • 这是一种变通方法,肯定不是优雅关机的完整解决方案。如果您愿意,可以使用sleep 30 &amp;&amp; forever restart test.js
      【解决方案4】:

      forever 有一个选项--killSignal,您可以将其自定义为其他可捕获的信号(例如 SIGINT),然后在您的应用程序中,使用 process.on('SIGINT', ...) 来捕获它。有一个official example,console.log 语句在信号处理程序中不起作用,我认为这是一个错误,希望尽快修复。

      【讨论】:

        猜你喜欢
        • 2018-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多