捕获SIGTERM与捕获SIGINT

Ale*_*lls 11 sigint node.js sigterm

在Node.js服务器中,捕获SIGTERM与捕获SIGINT之间有什么区别吗?

我认为进程不应该能够阻止SIGINT的关闭?

  process.once('SIGINT', function (code) {
    console.log('SIGINT received...');
    server.close();
  });

 // vs.

  process.once('SIGTERM', function (code) {
    console.log('SIGTERM received...');
    server.close();
  });
Run Code Online (Sandbox Code Playgroud)

我能够捕获两个信号并阻止退出吗?我的实验表明答案是肯定的,但从我读过的内容来看,SIGINT总是假设关闭一个进程.

或者我可能会把SIGINT与SIGKILL混淆?也许SIGKILL是我无法恢复的信号?

捕获这些信号当然可以让我优雅地关闭:

server.once('close', function(){
    // do some other stuff
    process.exit(2); // or whatever code pertains
});
Run Code Online (Sandbox Code Playgroud)

我想SIGINT与SIGKILL混淆了 -

如果我尝试这样做:

 process.once('SIGKILL', function (code) {
    console.log('SIGKILL received...');
    exitCode = code || 2;
    server.close();
  });
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

 internal/process.js:206
        throw errnoException(err, 'uv_signal_start');
        ^
    Error: uv_signal_start EINVAL
        at exports._errnoException (util.js:1022:11)
        at process.<anonymous> (internal/process.js:206:15)
        at emitTwo (events.js:106:13)
        at process.emit (events.js:191:7)
        at _addListener (events.js:226:14)
        at process.addListener (events.js:275:10)
        at process.once (events.js:301:8)
Run Code Online (Sandbox Code Playgroud)

显然你不允许捕获SIGKILL信号,但你可以捕获SIGINT和SIGTERM?

xpt*_*xpt 16

接受的答案是错误的.

  1. 来自https://en.wikipedia.org/wiki/Unix_signal

SIGTERM SIGTERM信号被发送到进程以请求终止... SIGINT几乎与SIGTERM相同.

  1. 命令说明kill不正确.

您可以捕获它们并仍然能够使用SIGKILL关闭进程 - kill -9 pid

那是错的.再次,从维基上面:

所述SIGKILL信号被发送到一个进程,以使其立即终止(杀死).与SIGTERM和SIGINT相反,此信号无法捕获或忽略,接收过程无法在接收到此信号时执行任何清理.

总而言之,

SIGINT几乎与SIGTERM相同.

  • 它们必须不同的原因是因为 SIGTERM 专门在应该终止程序时发生。SIGINT 只是意味着用户按下了 ctrl+c,这有时意味着终止,但并非总是如此。例如,在 VIM 中,ctrl+c 可能是编辑器中使用的实际命令,因此 SIGINT 仅用于告诉 VIM“哦,用户指的是 ctrl+c”。或者,考虑一下 bash 本身。当你按ctrl+c,即给bash一个SIGINT时,bash的工作是获取正在运行的任何进程,并给*那个*程序SIGINT(无论可能是什么程序)。如果你给 bash SIGTERM,它就会死掉。 (5认同)
  • 我认为措辞有些混乱。“您可以同时捕获它们(SIGINT 和 SIGTERM),并且仍然可以使用 `SIGKILL` - `kill -9 pid` 关闭进程”。这种说法是正确的。接受的答案是正确的。 (3认同)
  • 呃,是的,它们是三个不同的信号。你可以捕获 SIGINT 和 SIGTERM,并执行任何操作,*并且仍然*会被 SIGKILL 杀死。您不必这样做,但 OP 要求澄清信号之间的差异。给定的场景就是这样。您可以忽略 SIGINT 和 SIGTERM,但不能忽略 SIGKILL。这里没有人真的错了,哈哈。 (3认同)
  • 好吧,我纠正了@CraigHicks,并更改了我的措辞,因为它现在位于答案的顶部。也就是说,它比试图单独澄清已接受的答案有更多的责任。 (2认同)

Jim*_*tor 8

来自https://en.wikipedia.org/wiki/Unix_signal

SIGINT由用户按下生成Ctrl+C并且是interrupt

SIGTERM是发送请求进程终止的信号.kill命令发送一个SIGTERM,它是一个terminate

您可以捕获它们并仍然可以使用SIGKILL- 关闭该过程-kill -9 pid