В чём разница между kill -15 и kill -9 в Linux?

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

Ответ

В работе с серверами и контейнерами постоянно приходится управлять процессами. Разница фундаментальна с точки зрения корректного завершения работы сервисов.

kill -15 (или kill -TERM) отправляет сигнал SIGTERM. Это стандартный сигнал для корректного завершения процесса. Процесс получает уведомление и может выполнить cleanup: закрыть файловые дескрипторы, завершить сетевые соединения, сохранить состояние, остановить дочерние процессы. Например, веб-сервер Nginx при получении SIGTERM gracefully завершает обработку текущих соединений и только потом останавливается. В Docker команда docker stop сначала отправляет SIGTERM, давая контейнеру время на graceful shutdown.

kill -9 (или kill -KILL) отправляет сигнал SIGKILL. Это сигнал безусловного, немедленного завершения. Процесс не может его перехватить или проигнорировать — он уничтожается ядром ОС. Любые операции cleanup не выполняются. Это может привести к повреждению данных, «висящим» сокетам или «зомби»-процессам.

Правило в DevOps: Всегда сначала использовать SIGTERM. SIGKILL — это последнее средство, когда процесс не реагирует на TERM (завис).

# 1. Попытка graceful shutdown сервиса (например, через systemd)
sudo systemctl stop nginx
# Или напрямую процессу
sudo kill -15 $(cat /var/run/nginx.pid)

# 2. Ждём несколько секунд, проверяем
sleep 5
ps aux | grep nginx

# 3. Только если процесс всё ещё жив — принудительное завершение
sudo kill -9 $(cat /var/run/nginx.pid 2>/dev/null)

В сценариях оркестрации (Kubernetes) настройка terminationGracePeriodSeconds как раз определяет время ожидания между SIGTERM и SIGKILL для подов.