Поиграв с другим ответом, вот мое решение для этой задачи. Реализация этого способа помогает мне централизовать очистку в одном месте, предотвращая двойную обработку очистки.
- Я хотел бы направить все остальные коды выхода на код выхода.
const others = [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`]
others.forEach((eventType) => {
process.on(eventType, exitRouter.bind(null, { exit: true }));
})
- Что делает exitRouter, так это вызывает process.exit ()
function exitRouter(options, exitCode) {
if (exitCode || exitCode === 0) console.log(`ExitCode ${exitCode}`);
if (options.exit) process.exit();
}
- На «выходе» обработайте очистку с помощью новой функции
function exitHandler(exitCode) {
console.log(`ExitCode ${exitCode}`);
console.log('Exiting finally...')
}
process.on('exit', exitHandler)
Для демонстрации, это ссылка на мою суть. В этом файле я добавляю setTimeout для фальсификации запуска процесса.
Если вы запускаете node node-exit-demo.jsи ничего не делаете, то через 2 секунды вы видите журнал:
The service is finish after a while.
ExitCode 0
Exiting finally...
Иначе, если до окончания обслуживания вы прекратите ctrl+C, вы увидите:
^CExitCode SIGINT
ExitCode 0
Exiting finally...
Произошло то, что процесс Node изначально был закрыт с кодом SIGINT, затем он перенаправился в process.exit () и, наконец, вышел с кодом выхода 0.