【发布时间】:2018-11-09 11:03:54
【问题描述】:
我正在尝试使用 pm2 将我的节点应用程序作为服务运行。
现在,启动和停止应用程序正常工作。但是,我想做一个优雅的关机。
我的应用程序已经监听 SIGINT,关闭服务器然后退出进程。然而,试图让 pm2 发送 SIGINT,只会导致应用程序重新启动,就像 pm2 正在杀死并重新启动它一样。
这就是我创建流程的方式:
pm2 start server.js --name ProcessName --silent --kill-timeout 3000
这是我的应用程序监听 SIGINT 的代码:
process.on("SIGINT", function () {
//graceful shutdown
server.end().then(() => {
process.exit();
}).catch((err) => {
console.error(err);
});
});
然后使用 pm2 关闭应用程序,我正在运行:
pm2 sendSignal SIGINT ProcessName
这又会重新启动应用程序。
阅读 pm2 文档,我发现 pm2 也会向应用发送shutdown 事件,所以我补充说:
process.on('message', function(msg) {
if (msg == 'shutdown') {
server.end().then(() => {
process.exit();
}).catch((err) => {
console.error(err);
});
}
});
这也不起作用。
知道如何解决这个问题吗?
谢谢!
【问题讨论】:
-
正常启动你的代码不会崩溃吗? (喜欢
node server.js) -
不,它工作得很好。当我按下 CTRL+C 并优雅地存在(在日志文件和所有内容中记录一些输出)时,它确实捕获了 SIGINT。
-
啊,我误解了这个问题。改为使用
pm2 stop关闭应用程序。这会发送 sigint 并且不会重新启动它。 -
@ReverseCold 已经尝试过了。停止命令发送一个 SIGINT 但应用程序永远不会得到它,它确实停止了应用程序,但不是优雅的。运行 pm2 monit 您会看到发送了 SIGINT。我在想发生了一些奇怪的事情,也许 pm2 包装进程被 SIGINT 而不是应用程序本身杀死了。我不知道...试图找到一个解释。
-
是否以常规方式启动应用程序并发送信号?