Ответ
В работе с серверами и контейнерами постоянно приходится управлять процессами. Разница фундаментальна с точки зрения корректного завершения работы сервисов.
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 для подов.