Jo *_*ina 6 node.js npm npm-run
我在运行的 Nodejs 应用程序之一上遇到了问题npm start(它只是这样做node app.js)。
我的应用程序包含一个 sigint 处理程序,如下所示:
process.on('SIGINT', () => {
db.disconnect().then({
process.exit(0);
}).catch(e => process.exit(1));
});
Run Code Online (Sandbox Code Playgroud)
带有相应的日志。在对其他文件进行了一些测试之后,我注意到npm如果第一个需要很长时间才能退出,那么在进程上的 Ctrl-C会触发两次 SIGINT。(尝试在示例应用程序上添加超时)。
现在我已经添加了一个计数器来检查调用是否多次执行,但我不确定这是关于这个问题的“要走的路”。我猜测 npm 进程上的 SIGINT 预计会在某个时间范围内退出,这就是 npm 再传递一次(总是只有两次)的原因。
有没有人遇到过这个问题并找到了可行的解决方案?
谢谢!
您可能想直接通过 node 而不是通过 运行命令npm start。NPM 可能是导致奇怪的信号捕获的原因,请参阅https://lisk.io/blog/tutorial/why-we-stopped-using-npm-start-child-processes。
您的 SIGINT 处理程序可能会被多次调用,您应该编写代码来防止这种情况。
另外,如果您正在运行父/子进程,请参阅https://github.com/jtlapp/node-cleanup
当您按下 Ctrl-C 时,您将向当前进程组中的每个进程发送 SIGINT 信号。进程组是一组进程,这些进程应该作为一个组一起结束,而不是独立地持续存在。但是,某些程序(例如 Emacs)会拦截并重新利用 SIGINT,以便它不会结束进程。在这种情况下,SIGINT 不应结束该组的任何进程。
此外,大多数情况下不需要调用 process.exit,请参阅https://nodejs.org/api/process.html#process_process_exit_code
相反 set process.exitCode,删除信号处理程序,然后通过重新引发信号process.kill(process.pid, signal)
小智 5
我知道这篇文章已经存在了一段时间,但不幸的是我遇到了同样的问题。当运行时,node <app.js>它只发出一个信号。如果运行,该信号会出现两次npm start。相反,我建议检查服务器是否仍在侦听,如果是,则继续执行您的逻辑和内部终止(如数据库连接等):
process.on('SIGINT', function(){
if (server.listening) {
server.close(function (err) {
if (err) {
console.error(err);
process.exit(1)
}
process.exit(0);
})
}
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2690 次 |
| 最近记录: |