【发布时间】:2014-01-09 10:25:31
【问题描述】:
我有一个带有集群和 Forever 的应用程序。我想在关闭或重新启动应用程序之前保存来自工作人员的信息。所以我使用 process.on('SIGINT') 并且它适用于 CTRL+C。
但我一直坚持下去。是否有可能检测到应用程序以某种方式被 Forever 重新启动?有什么信号吗?
【问题讨论】:
标签: node.js
我有一个带有集群和 Forever 的应用程序。我想在关闭或重新启动应用程序之前保存来自工作人员的信息。所以我使用 process.on('SIGINT') 并且它适用于 CTRL+C。
但我一直坚持下去。是否有可能检测到应用程序以某种方式被 Forever 重新启动?有什么信号吗?
【问题讨论】:
标签: node.js
这个问题已经很老了,但是对于那些没有看到它的人来说,最新的永久版本支持 --killSignal(已在 2013 年 12 月添加),因此您可以通过示例使用 --killSignal=SIGUSR2 并使用 @ 捕获此信号987654322@
【讨论】:
永远使用 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 错误。
我建议在重新启动您的守护程序之前执行kill -s SIGUSR1 <pid>。这个信号很容易被process.on('SIGUSR1')在节点中捕获。
kill -s SIGUSR1 <pid>
forever restart test.js
【讨论】:
sleep 30 && forever restart test.js。
forever 有一个选项--killSignal,您可以将其自定义为其他可捕获的信号(例如 SIGINT),然后在您的应用程序中,使用 process.on('SIGINT', ...) 来捕获它。有一个official example,console.log 语句在信号处理程序中不起作用,我认为这是一个错误,希望尽快修复。
【讨论】: