web-dev-qa-db-fra.com

Attraper SIGTERM vs attraper SIGINT

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?

13
Alexander Mills

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

8
Jim Factor

La réponse acceptée est fausse.

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

[~ # ~] sigterm [~ # ~] Le signal SIGTERM est envoyé à un processus pour demander sa terminaison ... SIGINT est presque identique à SIGTERM .

  1. La description de la commande 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.

16
xpt