455 votes

faire une action de nettoyage juste avant que le sort de node.js

Je veux dire node.js de toujours faire quelque chose juste avant de s’arrêter, pour une raison quelconque - Ctrl + C, exception ou toute autre raison.

J’ai essayé ceci :

Démarré le processus, il a tué, et rien n’est arrivé ; relancée, appuyer sur Ctrl + C, et toujours rien ne se passe...

696voto

Emil Condrea Points 2175

METTRE À JOUR:

Vous pouvez enregistrer un gestionnaire pour process.on('exit') et dans tous les autres cas ( SIGINT ou exception non gérée) pour appeler process.exit()

 process.stdin.resume();//so the program will not close instantly

function exitHandler(options, err) {
    if (options.cleanup) console.log('clean');
    if (err) console.log(err.stack);
    if (options.exit) process.exit();
}

//do something when app is closing
process.on('exit', exitHandler.bind(null,{cleanup:true}));

//catches ctrl+c event
process.on('SIGINT', exitHandler.bind(null, {exit:true}));

//catches uncaught exceptions
process.on('uncaughtException', exitHandler.bind(null, {exit:true}));
 

206voto

CanyonCasa Points 11

Pour avoir un traiteur pour toutes les réponses, placer le code dans un module, par exemple, cleanup.js ci-dessous et de le transmettre à votre application spécifique de nettoyage de rappel. (Vous pouvez soin d'enlever la console.journal des opérations du code réel.)

// cleanup.js
// object to capture process exits and call app specific cleanup function...

function noOp() {};

exports.Cleanup = function Cleanup(callback) {

  // attach user callback to the process event emitter
  // if no callback, it will still exit gracefully on Ctrl-C
  callback = callback || noOp;
  process.on('cleanup',callback);

  // do app specific cleaning before exiting
  process.on('exit', 
    function () {
      process.emit('cleanup');
      }
    );

  // catch ctrl+c event and exit normally
  process.on('SIGINT', 
    function () {
      console.log('Ctrl-C...');
      process.exit(2);
      }
    );

  //catch uncaught exceptions, trace, then exit normally
  process.on('uncaughtException', 
    function(e) {
      console.log('Uncaught Exception...');
      console.log(e.stack);
      process.exit(99);
      }
    );

  };

Ce code intercepte les exceptions non traitées, Ctrl-C, ou une sortie normale de l'événement, et appelle à un seul utilisateur en option fonction de nettoyage avant de quitter, de la manipulation de toutes les conditions de sortie avec un seul objet. Le module étend simplement le processus de l'objet au lieu de définir un autre événement de l'émetteur. Sans une application spécifique de rappel de nettoyage par défaut à un pas de l'op de la fonction. C'était suffisant pour mon utilisation où les processus enfants ont été laissés en cours d'exécution lorsque vous quittez en appuyant sur Ctrl-C. Vous pouvez facilement ajouter de la sortie d'autres événements tels que SIGHUP comme souhaité. Remarque: par NodeJS manuel, SIGKILL ne peut pas avoir un auditeur. Le test de code ci-dessous montre les différentes manières d'utiliser cleanup.js ...

// test cleanup.js on version 0.10.21

// loads module and registers app specific cleanup callback...
var cleanup = require('./cleanup').Cleanup(myCleanup);
//var cleanup = require('./cleanup').Cleanup(); // will call noOp

// defines app specific callback...
function myCleanup() {
  console.log('My cleanup...');
  // place app specific cleanup code here
  };

// all of the following code only needed for test demo...
process.stdin.resume(); //so the program will not close instantly

// emits an uncaught exception when called because module does not exist
function error() {
  console.log('error');
  var x = require('');
  };

// try each of the following one at a time...

// uncomment next line to test exiting on an uncaught exception
//setTimeout(error,2000);

// uncomment next line to text exiting normally
//setTimeout(function(){process.exit(3)},2000);

// type Ctrl-C to test forced exit 

25voto

user1278519 Points 101

"exit" est un événement qui est déclenché lorsque le noeud le terminer boucle d'évènements en interne, il n'est pas déclenché lorsque vous terminez le processus de l'extérieur.

Ce que vous cherchez est l'exécution de quelque chose sur un SIGINT.

Les docs à http://nodejs.org/api/process.html#process_signal_events donner un exemple:

Exemple de l'écoute pour SIGINT:

// Start reading from stdin so we don't exit.
process.stdin.resume();

process.on('SIGINT', function () {
  console.log('Got SIGINT.  Press Control-D to exit.');
});

Note: il semble interrompre le sigint et vous auriez besoin de processus d'appel.exit() lorsque vous avez terminé avec votre code.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X