Ответ
Нет, сигнал SIGKILL (номер 9) невозможно проигнорировать, перехватить или заблокировать.
Это гарантированный механизм ядра Linux для принудительного завершения процесса. Когда процесс получает SIGKILL, ядро немедленно прекращает его выполнение, не давая ему возможности выполнить какую-либо очистку.
Практическое значение для DevOps:
- SIGTERM (15) — это "вежливый" сигнал завершения. Процесс может перехватить его (
trapв bash,signal()в C), чтобы корректно завершить работу (закрыть соединения, сохранить состояние). В сценариях оркестрации (Kubernetes, systemd) сначала отправляется SIGTERM, и только после таймаута — SIGKILL. - SIGKILL (9) — это "последнее средство". Используется, когда процесс не реагирует на SIGTERM, завис или потребляет критические ресурсы.
Пример на bash, демонстрирующий разницу:
#!/bin/bash
# Этот обработчик сработает для SIGTERM, но НЕ для SIGKILL
trap 'echo "Получен SIGTERM, выполняю очистку..."; exit 0' TERM
echo "PID: $$"; echo "Ожидаю сигналов..."
while true; do sleep 1; done
Запустив этот скрипт, вы можете проверить:
kill -TERM <PID> # Скрипт выведет сообщение и завершится
kill -KILL <PID> # Скрипт будет немедленно убит без вывода
В конфигурации Docker (STOPSIGNAL) или Kubernetes (terminationGracePeriodSeconds) настраивается, какой сигнал и с каким таймаутом отправляется контейнеру перед принудительным SIGKILL.