Catching SIGTERM vs catching SIGINT

萝らか妹 提交于 2021-02-06 15:09:43

问题


In Node.js servers, is there any difference between catching SIGTERM vs catching SIGINT?

I thought processes were not supposed to be able to prevent shutdown upon a SIGINT?

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

 // vs.

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

Am I able to trap both signals and prevent exit? My experimentation suggests the answer is yes, but from what I have read, SIGINT is always suppose to shutdown a process.

Or maybe I am confusing SIGINT with SIGKILL? Maybe SIGKILL is the signal that I cannot recover from?

Trapping these signals of course allows me to gracefully shutdown:

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

I think I am confusing SIGINT with SIGKILL -

if I try to do this:

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

I get this error:

 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)

So apparently you are not allowed to trap the SIGKILL signal, but you can trap SIGINT and SIGTERM?


回答1:


From https://en.wikipedia.org/wiki/Unix_signal:

SIGINT is generated by the user pressing Ctrl+C and is an interrupt

SIGTERM is a signal that is sent to request the process terminates. The kill command sends a SIGTERM and it's a terminate

You can catch both SIGTERM and SIGINT and you will always be able to close the process with a SIGKILL or kill -9 [pid].




回答2:


The accepted answer is wrong.

  1. From https://en.wikipedia.org/wiki/Unix_signal

SIGTERM The SIGTERM signal is sent to a process to request its termination... SIGINT is nearly identical to SIGTERM.

  1. The description around command kill is incorrect.

You can catch both of them and still be able to close the process with a SIGKILL - kill -9 pid

That's wrong. Again, from above wiki:

The SIGKILL signal is sent to a process to cause it to terminate immediately (kill). In contrast to SIGTERM and SIGINT, this signal cannot be caught or ignored, and the receiving process cannot perform any clean-up upon receiving this signal.

So, all in all,

SIGINT is nearly identical to SIGTERM.



来源:https://stackoverflow.com/questions/42450501/catching-sigterm-vs-catching-sigint

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!