You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
});

额外排查点

  1. 确保SIGINT处理器尽早注册:把这段代码放在程序最开始的位置,别让其他异步逻辑或者未捕获的异常挡住它的注册。如果程序在注册处理器之前就崩溃了,那自然无法响应Ctrl+C。
  2. 检查randomString函数:如果这个函数内部抛出了异常,也会中断处理器的执行,导致日志没打印。可以先把它换成固定字符串测试,比如'test_session',看是否能正常触发日志。
  3. 如果程序有长期阻塞操作:如果你的程序卡在某个同步阻塞任务里(比如大计算、慢同步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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:54:54