Der unten stehende Skript erlaubt es, einen einzelnen Handler für alle Beendigungsbedingungen zu haben. Es verwendet eine app-spezifische Callback-Funktion, um benutzerdefinierten Aufräumcode auszuführen.
cleanup.js
// Objekt zum Erfassen von Prozessbeendigungen und zum Aufruf von app-spezifischen Aufräumfunktionen
function noOp() {};
exports.Cleanup = function Cleanup(callback) {
// Nutzer-Callback an das Prozessereignisemitter anhängen
// wenn kein Callback vorhanden ist, wird es dennoch ordnungsgemäß bei Strg+C beendet
callback = callback || noOp;
process.on('cleanup',callback);
// App-spezifische Bereinigung vor dem Beenden durchführen
process.on('exit', function () {
process.emit('cleanup');
});
// Strg+C-Ereignis abfangen und normal beenden
process.on('SIGINT', function () {
console.log('Strg+C...');
process.exit(2);
});
// Unbehandelte Ausnahmen abfangen, verfolgen und dann normal beenden
process.on('uncaughtException', function(e) {
console.log('Unbehandelte Ausnahme...');
console.log(e.stack);
process.exit(99);
});
};
Dieser Code erfasst unbehandelte Ausnahmen, Strg+C- und normale Beendigungsvorgänge. Er ruft dann eine einzelne optionale Benutzerbereinigungsrückruffunktion auf, bevor er beendet wird, und behandelt alle Beendigungsbedingungen mit einem einzigen Objekt.
Das Modul erweitert einfach das process-Objekt anstelle eines anderen Ereignisemitters zu definieren. Ohne eine app-spezifische Callback-Funktion wird die Bereinigung auf eine No-Op-Funktion zurückgesetzt. Dies war für meinen Gebrauch ausreichend, wo Kindprozesse ausgeführt wurden, wenn durch Strg+C beendet wurde.
Sie können problemlos weitere Beendeereignisse wie SIGHUP hinzufügen, wenn gewünscht. Hinweis: Gemäß dem NodeJS-Handbuch kann SIGKILL keinen Listener haben. Der unten stehende Testcode zeigt verschiedene Möglichkeiten der Verwendung von cleanup.js
// Test cleanup.js auf Version 0.10.21
// Lädt das Modul und registriert die app-spezifische Bereinigungsrückrufroutine...
var cleanup = require('./cleanup').Cleanup(myCleanup);
//var cleanup = require('./cleanup').Cleanup(); // wird noOp aufrufen
// Definiert eine app-spezifische Callback-Funktion...
function myCleanup() {
console.log('App-spezifischer Bereinigungscode...');
};
// Der folgende Code wird nur für den Testdemo benötigt
// Verhindert, dass das Programm sofort geschlossen wird
process.stdin.resume();
// Löst eine unbehandelte Ausnahme aus, wenn aufgerufen, da das Modul nicht existiert
function error() {
console.log('Fehler');
var x = require('');
};
// Probieren Sie jeweils das Folgende nacheinander aus:
// Kommentieren Sie die nächste Zeile aus, um das Beenden bei einer unbehandelten Ausnahme zu testen
//setTimeout(error,2000);
// Kommentieren Sie die nächste Zeile aus, um das normale Beenden zu testen
//setTimeout(function(){process.exit(3)}, 2000);
// Geben Sie Strg+C ein, um das erzwungene Beenden zu testen
1 Stimmen
Siehe github.com/nodejs/node/issues/20804