Node.js 如何检测控制台CTRL+C中断事件配置专属webhook通知
Node.js 自定义Ctrl+C终止逻辑实现方案
核心实现原理
在Node.js环境中,控制台按下Ctrl+C时,系统会向当前运行的进程发送SIGINT(中断信号),该信号的默认行为是直接终止进程。我们可以通过内置的process对象注册自定义监听器,拦截这个信号,替换默认的终止流程,整个逻辑和你现有的错误自动重启逻辑完全独立运行,不会互相干扰。
适配现有监控脚本的代码实现
把下面的代码加在脚本顶层(也就是browser、webhook、sleep这些实例完成初始化的位置之后即可,不需要修改你已经写好的catch自动重启逻辑):
// 退出状态标记,避免重复触发清理逻辑 let isShuttingDown = false; // 监听Ctrl+C触发的SIGINT信号 process.on('SIGINT', async () => { // 已经进入退出流程就直接返回,防止多次按快捷键重复执行 if (isShuttingDown) return; isShuttingDown = true; try { // 发送独立的停止通知,和异常重启的通知内容做明确区分 await webhook.send('Monitoring stopped(监控已停止)'); // 复用现有逻辑的资源清理动作,避免残留悬空的浏览器进程 if (browser) await browser.close(); } catch (processExitErr) { // 清理过程的异常仅输出日志,不触发原有的自动重启分支 console.log('退出流程执行报错:', processExitErr); } finally { // 所有自定义逻辑执行完成后,正式退出进程 process.exit(0); } });
运行逻辑说明
- 正常运行中抛出代码异常时,会完全沿用你原来写的catch分支:打错误日志、发重启通知、关浏览器、等延迟、重新调用库存检测函数,不会触发停止通知逻辑。
- 手动在控制台按Ctrl+C时,会直接走全局的SIGINT处理分支:发停止通知、关浏览器,执行完直接退出进程,不会触发自动重启流程。
注意事项
- 必须在退出逻辑里加状态标记:实际使用时用户可能短时间多次按Ctrl+C,没有标记会导致重复发webhook、重复调用浏览器关闭接口,甚至抛出未捕获的异步错误。
- 不要在监听到信号后立刻退出进程:要等webhook发送、浏览器关闭这些异步操作全部走完,再调用
process.exit(0),否则通知还没发出去进程就终止了,会出现通知丢失的问题。
补充提示:如果脚本是通过pm2、nohup等工具挂到后台运行,直接按Ctrl+C是不会给后台进程传SIGINT信号的,这种场景的停止逻辑需要在对应进程管理工具的配置里绑定钩子才能生效。
内容的提问来源于stack exchange,提问作者Sean Berrie
相关产品推荐
相关产品推荐

