在Node.js中检测CTRL+C



我从另一个SO问题中得到了这段代码,但节点抱怨使用process.stdin.setRawMode而不是tty,所以我更改了它。

之前:

var tty = require("tty");
process.openStdin().on("keypress", function(chunk, key) {
  if(key && key.name === "c" && key.ctrl) {
    console.log("bye bye");
    process.exit();
  }
});
tty.setRawMode(true);

之后:

process.stdin.setRawMode(true);
process.stdin.on("keypress", function(chunk, key) {
  if(key && key.name === "c" && key.ctrl) {
    console.log("bye bye");
    process.exit();
  }
});

在任何情况下,它只是创建一个完全无响应的节点进程,什么也不做,第一个进程抱怨tty,然后抛出错误,第二个进程什么都不做,禁用node的原生CTRL+C处理程序,所以当我按下它时,它甚至不会退出节点。我如何在Windows中成功处理<kbd]CTRL>+C

如果您试图捕获中断信号SIGINT,则不需要从键盘读取。nodejsprocess对象暴露了一个中断事件:

process.on('SIGINT', function() {
    console.log("Caught interrupt signal");
    if (i_should_exit)
        process.exit();
});

编辑:如果没有解决方法,在Windows上不起作用。请参阅此处

NPM模块death使用SIGINTSIGQUITSIGTERM

所以基本上,你所需要做的就是:

process.on('SIGINT', () => {});  // CTRL+C
process.on('SIGQUIT', () => {}); // Keyboard quit
process.on('SIGTERM', () => {}); // `kill` command

顺便说一句,这实际上可以多次调用SIGINTSIGQUITSIGTERM。。。不知道为什么,对我来说确实如此。

我通过这样做修复了它:

let callAmount = 0;
process.on('SIGINT', function() {
    if(callAmount < 1) {
        send.success(`✅ The server has been stopped`, 'Shutdown information', 'This shutdown was initiated by CTRL+C.');
        setTimeout(() => process.exit(0), 1000);
    }
    callAmount++;
});

如果你只想检测中断键,只需使用SIGINT

编辑:我没有意识到这个帖子很旧,哦,好吧,我想它对其他人有帮助!

对于那些需要该功能的人,我发现了死亡(npm结节,哈哈!)。

作者还声称它适用于windows:

它只在兼容POSIX的系统上进行了测试。这里有一个关于Windows信号的很好的讨论,显然,这已经被修复/映射了。

我可以确认CTRL+C在win32上工作(是的,我很惊讶)。

process.on('signal', async (signal) => {
    console.log('signal: ', signal);
    if (signal === 'SIGINT') {
        console.log('Received SIGINT. Calling save function...');
        await amazon.saveData();
    }
    process.exit(0);
});
if (event.key == "ctrl+c") {
    console.log("goodbye");
    break;
}

相关内容

  • 没有找到相关文章

最新更新