Сигналы в Linux и их обработка в Node.js

Карпич Дмитрий

Что такое сигналы?

Определение: сигналы в Unix-подобных системах - это асинхронные события, которые могут быть отправлены процессу операционной системы или другому процессу.
Аналогия: сигналы можно сравнить с "уведомлениями" для процессов (например, "завершись", "приостановись").
Примеры ситуаций: приостановка процесса с помощью команды Ctrl+Z, команда Ctrl+C, завершение процесса, ошибка сегментации и т.п.

Типы сигналов

Сигналы по умолчанию: SIGINT, SIGTERM, SIGKILL, SIGSTOP и т.д.
Сигналы пользовательских действий: SIGUSR1, SIGUSR2.
Сигналы от системных ошибок: SIGSEGV, SIGFPE, SIGPIPE и т.д.

Отправка сигналов процессам

Команда kill

используется для отправки сигналов процессу.

kill -SIGINT 1234

Команда killall

используется для отправки сигналов всем процессам с определенным именем.

killall -SIGTERM myprocess

Команда pkill

используется для отправки сигналов процессам, соответствующим определенному шаблону.

pkill -SIGKILL myprocess

Некоторые сигналы в Linux

  • SIGHUP (1) — потеря соединения с управляющим терминалом
  • SIGINT (2) — прерывание процесса с клавиатуры (Ctrl+C)
  • SIGQUIT (3) — аварийное завершение
  • SIGABRT (6) — аварийная остановка процесса
  • SIGKILL (9) — немедленное завершение (не блокируется)
  • SIGTERM (15) — стандартный сигнал для завершения
  • SIGSTOP (17,19,23) — приостановка процесса до SIGCONT

Чем являются сигналы на базовом уровне

Сигналы в Linux на уровне ядра — это механизм асинхронного уведомления процессов, реализованный через прерывания на уровне ОС.

Реализация

Очередь сигналов в ядре

Ядро поддерживает очередь непрочитанных сигналов для каждого процесса.

Обработка сигналов в процессе

Каждый процесс хранит информацию о полученных сигналах в полях sigaction, pending_signals и blocked.

Жизненный цикл сигнала

  1. Генерация

    Например: через kill(), аппаратное прерывание, исключение.

  2. Доставка

    Ядро помечает сигнал как "ожидающий" в pending маске процесса.

  3. Обработка

    При переключении контекста ядро проверяет pending и вызывает обработчик (если не заблокирован).

Обработка сигналов в node.js

В Node.js можно обрабатывать сигналы с помощью модуля process.


            process.on('SIGINT', () => {
                console.log('Received SIGINT. Exiting...');
                process.exit(0);
            });
        

Зачем перехватывать сигналы в Node.js?

Graceful Shutdown

Корректное завершение работы: закрытие соединений с БД, остановка HTTP-сервера перед выходом.

Кастомизация поведения

Выполнение кастомной логики перед завершением: логирование, отправка метрик, уведомления.

Игнорирование сигналов

Предотвращение завершения процесса по умолчанию (например, для фоновых демонов).

Перезагрузка конфигурации

Обновление настроек приложения без перезапуска (по сигналу SIGHUP).

Обработка ошибок

Cleanup при аварийных ситуациях: освобождение ресурсов, сохранение состояния.

Интеграция с оркестраторами

Корректная реакция на сигналы от Docker/Kubernetes (например, SIGTERM при остановке контейнера).

Демонстрация тестового кода с перехватом основных сигналов

Ссылка на репозитарий с кодом и презентацией

https://gitea.meettya.ru/Meettya/signal-slides