Node.js SIGINT处理器未打印消息,咨询进程会话保存实现
解决SIGINT处理器不打印消息的问题
嘿,我一眼就看到你代码里的几个小问题,这应该就是导致SIGINT处理器没正常工作的原因,咱们来一步步修复:
第一个坑:同步写入用了回调函数
fs.writeFileSync是同步阻塞式方法,它根本不接受回调参数!你写的那个function(err) {...}永远不会被执行,甚至可能因为参数不匹配引发隐性错误,直接中断了处理器里的代码流程——连console.log的消息都可能被吞掉。
修正后的代码示例
先把同步写入的回调去掉,改用try/catch来捕获错误(同步方法的错误会直接抛出),同时确保进程能正常退出:
process.on('SIGINT', function() { console.log('\nCaught Control+C. Saving session...'); try { const filename = 'session_'+randomString(10)+'.saved'; // 同步写入不需要回调,用try/catch捕获异常 fs.writeFileSync(filename, JSON.stringify({ 'jobs': jobs, 'config': config, 'verbose': verbose, 'max_retries': max_retries })); console.log(`Session successfully saved to ${filename}`); // 正常退出进程,避免残留 process.exit(0); } catch (err) { console.error('Failed to save session:', err); // 用非零状态码标记异常退出 process.exit(1); } });
额外排查点
- 确保SIGINT处理器尽早注册:把这段代码放在程序最开始的位置,别让其他异步逻辑或者未捕获的异常挡住它的注册。如果程序在注册处理器之前就崩溃了,那自然无法响应Ctrl+C。
- 检查
randomString函数:如果这个函数内部抛出了异常,也会中断处理器的执行,导致日志没打印。可以先把它换成固定字符串测试,比如'test_session',看是否能正常触发日志。 - 如果程序有长期阻塞操作:如果你的程序卡在某个同步阻塞任务里(比如大计算、慢同步IO),SIGINT信号要等阻塞完成才会触发。这种情况下建议改用异步写入
fs.writeFile,并在写入完成后再退出进程,同时移除重复监听避免多次触发:
process.on('SIGINT', function() { console.log('\nCaught Control+C. Saving session...'); const filename = 'session_'+randomString(10)+'.saved'; // 移除监听,防止多次触发Ctrl+C导致重复写入 process.removeAllListeners('SIGINT'); fs.writeFile(filename, JSON.stringify({ 'jobs': jobs, 'config': config, 'verbose': verbose, 'max_retries': max_retries }), function(err) { if (err) { console.error('Save failed:', err); process.exit(1); } console.log(`Session saved to ${filename}`); process.exit(0); }); });
内容的提问来源于stack exchange,提问作者Daniel Gray
相关产品推荐
相关产品推荐

