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をトラップすることはできますか?
から https://en.wikipedia.org/wiki/Unix_signal
SIGINT
は、ユーザーがCtrl+C
を押して生成され、interrupt
です。
SIGTERM
は、プロセスの終了を要求するために送信されるシグナルです。 killコマンドはSIGTERM
を送信し、それはterminate
です
両方をキャッチしても、SIGKILL
-kill -9 pid
でプロセスを閉じることができます。
受け入れられた答えは間違っています。
[〜#〜] sigterm [〜#〜]SIGTERMシグナルがプロセスに送信され、その終了を要求します... SIGINTはSIGTERMとほぼ同じです。
kill
に関する説明が正しくありません。あなたはそれらの両方をキャッチし、それでもSIGKILLでプロセスを閉じることができます-kill -9 pid
それは間違っている。もう一度、上記のwikiから:
[〜#〜] sigkill [〜#〜]シグナルがプロセスに送信され、プロセスが直ちに終了します(kill)。 SIGTERMおよびSIGINTとは対照的に、このシグナルをキャッチまたは無視することはできず、受信プロセスはこのシグナルの受信時にクリーンアップを実行できません。
つまり、全体として、
SIGINTはSIGTERMとほぼ同じです。