Node.js中如何捕获并忽略SIGINT信号?捕获失效如何排查?
我找到了一篇相关主题的帖子《How to perform an async operation on exit》,但它可能不适用于macOS系统,或者在Node.js v14版本中已经不生效了。
我最初的问题更复杂:我无法在SIGINT的回调(或异步回调)中让setTimeout或await正常运行。后来我意识到,我首先需要实现的是捕获并忽略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); }); });
按下Ctrl+C或者向进程发送SIGINT信号后,以上所有方法都无法阻止我的Node.js服务关闭。
更新
当我直接用node app.js启动服务时,SIGINT拦截功能完全正常!
显然之前的异常是我通过nodemon间接启动服务导致的:IDE终端按下Ctrl+C或者点击IDE的红色🟥停止按钮发送的中断信号实际上被发送给了nodemon,所以无法被业务进程捕获。在IDE环境外、不使用nodemon启动时,优雅关闭功能就可以正常运行。
内容的提问来源于stack exchange,提问作者kshetline
相关产品推荐
相关产品推荐

