Когда нужно использовать сигнал SIGKILL?

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

Ответ

Сигнал SIGKILL (код 9) — это сигнал безусловного завершения процесса. Его следует использовать только в крайних случаях, когда процесс игнорирует корректные запросы на завершение.

Правильная последовательность завершения процесса:

  1. SIGTERM (15): Вежливый запрос на завершение. Процесс получает уведомление и может выполнить процедуры очистки (закрыть файлы, завершить сетевые соединения, сохранить состояние). Это стандартный сигнал для kill и systemctl stop.
  2. SIGINT (2): Аналогичен нажатию Ctrl+C. Часто обрабатывается приложениями для graceful shutdown.
  3. SIGKILL (9): Применяется, если процесс не завершился после SIGTERM в течение заданного таймаута.

Конкретные сценарии для SIGKILL:

  • Процесс "завис" и не реагирует на другие сигналы.
  • Критическая ситуация, когда процесс потребляет все ресурсы и его нужно остановить немедленно.
  • В скриптах оркестрации или systemd unit files, где после TimeoutStopSec используется SendSIGKILL=yes.

Пример с таймаутом (в скрипте или вручную):

# Отправляем SIGTERM
kill -15 <PID>
# Ждём 30 секунд
sleep 30
# Проверяем, жив ли процесс. Если да — отправляем SIGKILL
if kill -0 <PID> 2>/dev/null; then
    echo "Процесс не ответил на SIGTERM, отправляем SIGKILL"
    kill -9 <PID>
fi

Важные предостережения:

  • SIGKILL нельзя перехватить или проигнорировать процессом. Ядро завершает процесс немедленно.
  • Это может привести к утечкам ресурсов (незакрытые файловые дескрипторы, сокеты), повреждению данных (если процесс писал в файл) или нарушению целостности (незавершённые транзакции в БД).
  • В production-средах перед kill -9 всегда стоит проверить логи процесса и состояние дисковых операций (команда iostat или iotop), чтобы понять причину зависания.