【发布时间】:2019-07-10 08:30:14
【问题描述】:
我在使用npm start 运行的一个Nodejs 应用程序上遇到了问题(它只是node app.js)。
我的应用包含一个如下的 sigint 处理程序:
process.on('SIGINT', () => {
db.disconnect().then({
process.exit(0);
}).catch(e => process.exit(1));
});
有相应的日志。在对其他文件进行一些测试之后,我注意到在npm 进程上的 Ctrl-C 如果第一个需要太长时间才能退出,则会触发两次 SIGINT。 (尝试在示例应用上添加超时)。
现在我已经添加了一个计数器来检查调用是否被多次执行,但我不确定这是关于这个问题的“方法”。我猜测 npm 进程上的 SIGINT 预计会在某个时间范围内退出,这就是 npm 再传递一次(总是只有两次)的原因。
有没有人遇到过这个问题并找到了可行的解决方案?
谢谢!
【问题讨论】:
-
无法复制。您能否添加更多导致您出现这种行为的代码?
-
嘿@DanieleDellafiore,感谢您抽出宝贵时间。这是一个带有一些说明和示例的要点:gist.github.com/jsmrcaga/c84236eece0c27baffec28e79896d4a4
-
不会发生.. node/npm 版本?
-
这也发生在我身上,但不是在所有环境中。当我在 Windows10(和 Windows7)上使用 gitbash 在本地运行 npm->node 并在 Ubuntu 上使用 GNOME 终端时,它不会发生。当我通过 ssh 在 centOS 上运行时,使用
npm start并使用 CTRL+C 关闭,以及使用systemctl start/stop service,终止信号被发送两次,而在以node index.js开始后,它只发送一次。所有设置上的节点 8.15.0 和 Npm 6.4.1。 -
如果有人在他们的节点脚本中运行 puppeteer,请确保在启动浏览器时将
handleSIGINT设置为false:await puppeteer.launch({ handleSIGINT: false, ...})导致 puppeteer 在 SIGINT 上调用 process.exit()。