Как мне поймать * и проигнорировать * SIGINT в Node.js?
Я нашел другое сообщение по связанной теме (Как выполнить асинхронную операцию при выходе ), но, возможно, это не относится к macOS или просто больше не соответствует действительности при запуске Node.js v14.
Мой первоначальный вопрос был более сложным. Я не мог получить
setTimeout
s или
await
для правильной работы в обратном вызове (или асинхронном обратном вызове) для SIGINT. Но потом я понял, что мне действительно нужно, прежде всего, это уметь ловить и игнорировать SIGINT.
Если бы я мог это сделать, я мог бы отключиться и в ответ на SIGINT, если бы и когда захотел.
Поэтому я вернулся к основам, чтобы посмотреть, можно ли просто отключить SIGINT. Я не мог.
Я мог обнаружить SIGINT, я мог отвечать консольными сообщениями или любым другим синхронным кодом, но мой код должен был отключиться и вскоре выключиться, что бы я ни делал.
process.on('SIGINT', () => { console.log('here'); return false; });
process.on('SIGINT', () => { console.log('here'); return true; });
process.on('SIGINT', () => { console.log('here'); return undefined; });
process.on('SIGINT', () => { console.log('here'); return new Promise(resolve => { console.log(resolve); }); });
Ни один из этих подходов не предотвращает выключение моего сервера Node.js после нажатия Ctrl-C или иной отправки SIGINT процессу.
ОБНОВИТЬ:
Когда я запускаю свой сервер через
node app.js
, Перехват SIGINT работает как надо!
По-видимому, я сошел с ума из-за артефакта косвенного запуска моего серверного приложения через
nodemon
. Ctrl-C с моего терминала IDE или прерывание, отправленное с помощью графической красной кнопки 🟥 (стоп) среды IDE, не могут быть правильно пойманы, потому что результирующий сигнал действительно отправляется nodemon. Однако вне среды IDE, без участия nodemon, мое плавное завершение работы работает так, как я хочу.
1 ответ
Если вы наблюдаете такое неожиданное завершение работы, всегда думайте «кто какой сигнал посылает?». В зависимости от ОС и других процессов может быть отправлено множество других сигналов, например, см. Как SIGINT соотносится с другими сигналами завершения, такими как SIGTERM, SIGQUIT и SIGKILL?.
В вашем случае, скорее всего, произошло то, что
nodemon
процесс отправлял
SIGKILL
после
SIGINT
. Существует несколько таких сигналов, которые нельзя отменить.