Есть ли сигнал, который нельзя обработать или перехватить?

«Есть ли сигнал, который нельзя обработать или перехватить?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в Linux существуют два сигнала, которые невозможно перехватить, заблокировать или проигнорировать пользовательским обработчиком:

  1. SIGKILL (сигнал 9): Немедленное безусловное завершение процесса. Ядро останавливает процесс, не давая ему возможности выполнить какую-либо cleanup-логику.
  2. SIGSTOP (сигнал 19): Немедленная безусловная приостановка (останов) выполнения процесса. Процесс переводится в состояние TASK_STOPPED и может быть продолжен сигналом SIGCONT.

Практическое значение для DevOps и администрирования:

  • SIGKILL — последнее средство. В скриптах и оркестраторах (Kubernetes, systemd) сначала отправляется SIGTERM (15), чтобы приложение корректно завершилось. Если процесс не отвечает в течение таймаута (например, terminationGracePeriodSeconds в Kubernetes), тогда отправляется SIGKILL.
  • Пример в скрипте: Попытка перехватить SIGKILL бесполезна.
    #!/bin/bash
    # Этот обработчик никогда не сработает для SIGKILL
    trap "echo 'Завершаю работу чисто'" EXIT TERM INT
    echo "PID: $$"; sleep 100

    Вызов kill -9 $$ завершит скрипт мгновенно, сообщение не выведется.

  • SIGSTOP/SIGCONT для отладки. Эти сигналы можно использовать для приостановки фонового процесса, чтобы исследовать состояние системы (открытые файлы, использование памяти), а затем возобновить его работу.

Важно: Все остальные сигналы (TERM, INT, HUP и т.д.) могут быть перехвачены или проигнорированы процессом, что необходимо учитывать при написании скриптов развертывания и управления сервисами.