Как мне поймать * и проигнорировать * SIGINT в Node.js?

Я нашел другое сообщение по связанной теме (Как выполнить асинхронную операцию при выходе ), но, возможно, это не относится к macOS или просто больше не соответствует действительности при запуске Node.js v14.

Мой первоначальный вопрос был более сложным. Я не мог получить setTimeouts или 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. Существует несколько таких сигналов, которые нельзя отменить.

Другие вопросы по тегам