如何在 Node.js 中捕获*并忽略* SIGINT?

ksh*_*ine 8 javascript sigint node.js graceful-shutdown

我发现了一篇关于相关主题的不同帖子(如何在退出时执行异步操作),但它可能不适用于 macOS,或者在运行 Node.js v14 时不再适用。

我原来的问题更复杂。我无法在 SIGINT 的回调(或异步回调)中正常工作setTimeoutawait但后来我意识到我真正需要做的,首先也是最重要的是能够捕获并忽略SIGINT。

如果我能做到这一点,那么如果我愿意的话,我也可以关闭以响应 SIGINT。

所以我回到基础知识,看看是否可以简单地禁用 SIGINT。我不能。

我可以检测到 SIGINT,我可以用控制台消息或任何其他同步代码进行响应,但无论我做什么,我的代码都会关闭,而且很快就会关闭。

process.on('SIGINT', () => { console.log('here'); return false; });
process.on('SIGINT', () => { console.log('here'); return true; });
process.on('SIGINT', () => { console.log('here'); return undefined; });
process.on('SIGINT', () => { console.log('here'); return new Promise(resolve => { console.log(resolve); }); });
Run Code Online (Sandbox Code Playgroud)

Ctrl这些方法都无法阻止我的 Node.js 服务器在点击+后关闭C,或者以其他方式向进程发送 SIGINT。

更新:

当我通过运行我的服务器时node app.js,SIGINT 拦截正在正常工作!

显然,我已经被通过nodemon. 来自我的 IDE 终端的+或使用 IDE 图形红色(停止)按钮发送的中断无法正确捕获,因为生成的信号实际上被发送到 nodemon CtrlC然而,在 IDE 环境之外,如果没有 nodemon 参与进来,我的优雅关闭就会按照我想要的方式工作。

B M*_*B M 5

如果你观察到这种意外的关闭行为,总是会想“谁在发送什么信号?”。根据操作系统和其他进程,可以发送许多其他信号,例如,请参阅SIGINT 如何与其他终止信号(如 SIGTERM、SIGQUIT 和 SIGKILL)相关?

在您的情况下最有可能发生的是该nodemon进程SIGKILLSIGINT. 存在几个无法中止的此类信号。 nodemon允许通过 控制默认终止信号--signal,请参阅https://github.com/remy/nodemon/blob/master/doc/cli/options.txtnodemon还可以通过本地和全局配置文件进行配置,请参阅https://github.com/remy/nodemon/blob/master/doc/cli/config.txt