Node.js v18中process.on('signal')无法捕获SIGINT(CTRL-C)的问题
Node.js捕获CTRL-C(SIGINT)信号失败的解决方法
你的代码核心问题是监听的事件名称错误:Node.js中捕获信号的正确方式是监听具体的信号名称(如SIGINT),而非通用的signal事件。
修正后的代码
process.on('SIGINT', async () => { console.log('Received SIGINT. Calling save function...'); try { await amazon.saveData(); console.log('Data saved successfully'); process.exit(0); } catch (err) { console.error('Failed to save data:', err); process.exit(1); } });
关键注意事项
- 不要在
await后直接无条件调用process.exit(0):异步操作saveData需要时间执行,提前exit会导致数据保存未完成就终止进程。 - 加入
try/catch捕获保存过程中的错误:避免无提示退出,同时通过退出码区分执行结果(0为成功,1为错误)。 - 如需监听多个信号(如
SIGTERM),可以复用同一个处理函数:
async function handleSignal(signal) { console.log(`Received ${signal}. Saving data...`); try { await amazon.saveData(); console.log('Data saved'); process.exit(0); } catch (err) { console.error('Save failed:', err); process.exit(1); } } process.on('SIGINT', handleSignal); process.on('SIGTERM', handleSignal);
内容的提问来源于stack exchange,提问作者chovy
相关产品推荐
相关产品推荐

