我在运行的一个 Nodejs 应用程序上遇到了问题npm start
(这只是node app.js
).
我的应用程序包含一个 sigint 处理程序,如下所示:
process.on('SIGINT', () => {
db.disconnect().then({
process.exit(0);
}).catch(e => process.exit(1));
});
有相应的日志。对其他文件进行一些测试后,我注意到 Ctrl-C 在npm
如果第一次退出的时间太长,进程会触发 SIGINT 两次。 (尝试在示例应用程序上添加超时)。
目前,我添加了一个计数器来检查调用是否执行多次,但我不确定这是否是解决此问题的“方法”。我猜测 npm 进程上的 SIGINT 预计会在某个时间范围内退出,这就是 npm 再次传递它一次的原因(总是只有两次)。
有没有人遇到过这个问题并找到可行的解决方案?
Thanks!
您可能想直接通过节点运行命令,而不是通过npm start
。 NPM 可能是导致奇怪的信号捕获的原因,请参阅https://lisk.io/blog/tutorial/why-we-stopped-using-npm-start-child-processes https://lisk.io/blog/tutorial/why-we-stopped-using-npm-start-child-processes.
您的 SIGINT 处理程序可能会被多次调用,您应该编写代码来防止这种情况。
另外,如果您正在运行父/子进程,请参阅https://github.com/jtlapp/node-cleanup https://github.com/jtlapp/node-cleanup
当你按下 Ctrl-C 时,你会向进程中的每个进程发送一个 SIGINT 信号。
当前进程组。进程组是一组进程,它们是
所有人都应该作为一个整体一起结束,而不是坚持下去
独立。然而,有些程序,例如 Emacs,会拦截并
重新调整 SIGINT 的用途,使其不会结束进程。在这种情况下,
SIGINT 不应结束该组的任何进程。
此外,大多数情况下不需要调用 process.exit,请参阅https://nodejs.org/api/process.html#process_process_exit_code https://nodejs.org/api/process.html#process_process_exit_code
而是设置process.exitCode
,删除信号处理程序,然后通过重新引发信号process.kill(process.pid, signal)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)