Dans les serveurs Node.js, y a-t-il une différence entre intercepter SIGTERM et intercepter SIGINT?
Je pensais que les processus n'étaient pas censés pouvoir empêcher l'arrêt d'un SIGINT?
process.once('SIGINT', function (code) {
console.log('SIGINT received...');
server.close();
});
// vs.
process.once('SIGTERM', function (code) {
console.log('SIGTERM received...');
server.close();
});
Suis-je capable de capturer les deux signaux et d'empêcher la sortie? Mon expérimentation suggère que la réponse est oui, mais d'après ce que j'ai lu, SIGINT est toujours supposé arrêter un processus.
Ou peut-être que je confond SIGINT avec SIGKILL? Peut-être que SIGKILL est le signal dont je ne peux pas récupérer?
Le piégeage de ces signaux me permet bien sûr d'arrêter gracieusement:
server.once('close', function(){
// do some other stuff
process.exit(2); // or whatever code pertains
});
Je pense que je confond SIGINT avec SIGKILL -
si j'essaye de faire ceci:
process.once('SIGKILL', function (code) {
console.log('SIGKILL received...');
exitCode = code || 2;
server.close();
});
Je reçois cette erreur:
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)
Donc, apparemment, vous n'êtes pas autorisé à intercepter le signal SIGKILL, mais vous pouvez intercepter SIGINT et SIGTERM?
De https://en.wikipedia.org/wiki/Unix_signal
SIGINT
est généré par l'utilisateur en appuyant sur Ctrl+C
et est un interrupt
SIGTERM
est un signal qui est envoyé pour demander la fin du processus. La commande kill envoie un SIGTERM
et c'est un terminate
Vous pouvez les attraper tous les deux et toujours pouvoir fermer le processus avec un SIGKILL
- kill -9 pid
La réponse acceptée est fausse.
[~ # ~] sigterm [~ # ~] Le signal SIGTERM est envoyé à un processus pour demander sa terminaison ... SIGINT est presque identique à SIGTERM .
kill
est incorrecte.Vous pouvez les attraper tous les deux et toujours pouvoir fermer le processus avec un SIGKILL - kill -9 pid
C'est faux. Encore une fois, depuis le wiki ci-dessus:
Le signal [~ # ~] sigkill [~ # ~] est envoyé à un processus pour qu'il se termine immédiatement (kill). Contrairement à SIGTERM et SIGINT, ce signal ne peut pas être capturé ou ignoré, et le processus de réception ne peut effectuer aucun nettoyage lors de la réception de ce signal.
Donc, dans l'ensemble,
SIGINT est presque identique à SIGTERM.