Node.js 中未捕获 Control-C

asi*_*nix 2 node.js

我想如果我运行它然后点击 control-C,程序应该在显示“退出...”后退出。它不是。当然,在实际应用中,我想做的不仅仅是console.log。

process.on('SIGINT', function() {
 console.log("Exiting...");
 process.exit();
});
while(1);
Run Code Online (Sandbox Code Playgroud)

它确实捕获但不退出。我必须单独终止进程。

节点版本 8.x LTS

编辑:编辑是为了让我在下面的评论之一变得清晰。正如在接受的答案中明确指出的那样,我的信号处理程序正在覆盖默认的处理程序,但它从未被执行过。Cntl-C 没有终止进程这一事实给我的印象是信号处理程序实际上正在执行。它只是覆盖了内置处理程序。答案是真正的信息丰富 - 用几句话就包含了信息。

Jim*_* B. 5

while(1)挂在流程上。将其更改为:

setInterval(() => {}, 1000);
Run Code Online (Sandbox Code Playgroud)

它的行为如您所愿。

我假设您用作while(1)正在运行的程序的占位符,但这不是准确的表示。一个普通的节点应用程序不会像这样同步地保持进程。

可能值得注意的是,当您执行时,process.on('SIGINT', ...您正在抢占节点的正常 SIGINT 处理程序,即使while(1)正在持有该进程,该处理程序也会在 ctrl-C 上退出。通过添加您自己的处理程序,您的代码将在节点到达它时运行,这将在当前同步事件周期之后运行,在这种情况下永远不会发生。