Nachdem ich mit anderen Antworten herumgespielt habe, ist hier meine Lösung für diese Aufgabe. Durch die Implementierung auf diese Weise kann ich die Bereinigung an einem Ort zentralisieren und verhindern, dass die Bereinigung doppelt behandelt wird.
- Ich möchte alle anderen Exit-Codes an den Exit-Code weiterleiten.
const others = [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`]
others.forEach((eventType) => {
process.on(eventType, exitRouter.bind(null, { exit: true }));
})
- Der exitRouter ruft process.exit () auf.
function exitRouter(options, exitCode) {
if (exitCode || exitCode === 0) console.log(`ExitCode ${exitCode}`);
if (options.exit) process.exit();
}
- Führen Sie beim Beenden die Bereinigung mit einer neuen Funktion durch
function exitHandler(exitCode) {
console.log(`ExitCode ${exitCode}`);
console.log('Exiting finally...')
}
process.on('exit', exitHandler)
Für den Demo-Zweck ist dies ein Link zu meinem Kern. In der Datei füge ich ein setTimeout hinzu, um den laufenden Prozess zu fälschen.
Wenn Sie laufen node node-exit-demo.js
und nichts tun, sehen Sie nach 2 Sekunden das Protokoll:
The service is finish after a while.
ExitCode 0
Exiting finally...
Andernfalls sehen Sie Folgendes ctrl+C
, wenn Sie vor Beendigung des Dienstes mit beenden :
^CExitCode SIGINT
ExitCode 0
Exiting finally...
Was passiert ist, ist, dass der Knotenprozess zunächst mit dem Code SIGINT beendet wurde, dann zu process.exit () weitergeleitet und schließlich mit dem Beendigungscode 0 beendet wird.