捕获SIGTERM与捕获SIGINT

时间:2017-02-25 00:31:19

标签: node.js sigint 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();
  });

我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但根据我的阅读,SIGINT总是假设关闭一个过程。

或许我对SIGKILL的SIGINT感到困惑?也许SIGKILL是我无法恢复的信号?

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

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

我认为SIGINT与SIGKILL混淆 -

如果我尝试这样做:

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

我收到此错误:

 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)

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

2 个答案:

答案 0 :(得分:13)

接受的答案是错误的。

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

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

    1. 有关命令kill的说明不正确。
    2.   

      你可以捕获它们并仍然可以用SIGKILL关闭进程 - kill -9 pid

      那是错的。再次,从wiki上面:

        

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

      所以,总而言之,

        

      SIGINT几乎与SIGTERM 相同。

答案 1 :(得分:7)

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

SIGINT是由用户按Ctrl+C生成的,是interrupt

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

您可以抓住这两者,但仍然可以使用SIGKILL - kill -9 pid

关闭整个过程