web-dev-qa-db-ja.com

SIGTERMのキャッチとSIGINTのキャッチ

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は常にプロセスをシャットダウンすると仮定しています。

それとも、SIGINTとSIGKILLを混同しているのでしょうか?たぶん、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をトラップすることはできますか?

13
Alexander Mills

から https://en.wikipedia.org/wiki/Unix_signal

SIGINTは、ユーザーがCtrl+Cを押して生成され、interruptです。

SIGTERMは、プロセスの終了を要求するために送信されるシグナルです。 killコマンドはSIGTERMを送信し、それはterminateです

両方をキャッチしても、SIGKILL-kill -9 pidでプロセスを閉じることができます。

8
Jim Factor

受け入れられた答えは間違っています。

  1. から https://en.wikipedia.org/wiki/Unix_signal

[〜#〜] sigterm [〜#〜]SIGTERMシグナルがプロセスに送信され、その終了を要求します... SIGINTはSIGTERMとほぼ同じです。

  1. コマンドkillに関する説明が正しくありません。

あなたはそれらの両方をキャッチし、それでもSIGKILLでプロセスを閉じることができます-kill -9 pid

それは間違っている。もう一度、上記のwikiから:

[〜#〜] sigkill [〜#〜]シグナルがプロセスに送信され、プロセスが直ちに終了します(kill)。 SIGTERMおよびSIGINTとは対照的に、このシグナルをキャッチまたは無視することはできず、受信プロセスはこのシグナルの受信時にクリーンアップを実行できません。

つまり、全体として、

SIGINTはSIGTERMとほぼ同じです。

16
xpt