我从另一个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
,则不需要从键盘读取。nodejs
的process
对象暴露了一个中断事件:
process.on('SIGINT', function() {
console.log("Caught interrupt signal");
if (i_should_exit)
process.exit();
});
编辑:如果没有解决方法,在Windows上不起作用。请参阅此处
NPM模块death
使用SIGINT
、SIGQUIT
和SIGTERM
。
所以基本上,你所需要做的就是:
process.on('SIGINT', () => {}); // CTRL+C
process.on('SIGQUIT', () => {}); // Keyboard quit
process.on('SIGTERM', () => {}); // `kill` command
顺便说一句,这实际上可以多次调用SIGINT
、SIGQUIT
和SIGTERM
。。。不知道为什么,对我来说确实如此。
我通过这样做修复了它:
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;
}