Ответ
SIGTERM — это сигнал, который операционная система отправляет процессу с запросом на корректное завершение (graceful shutdown). В контексте DevOps и контейнеризации правильная обработка SIGTERM критически важна для обеспечения нулевого времени простоя (zero-downtime) при деплоях, масштабировании и обслуживании инфраструктуры.
Как это работает в пайплайнах и оркестраторах:
- Когда я выполняю
kubectl delete pod,docker stop, или когда Horizontal Pod Autoscaler решает уменьшить количество реплик, оркестратор сначала отправляет контейнеру SIGTERM. - У приложения есть grace period (по умолчанию 30 секунд в Kubernetes) на то, чтобы завершить текущие операции: дообработать HTTP-запросы, закрыть соединения с БД, сохранить состояние на диск, остановить дочерние процессы.
- Если по истечении таймаута процесс еще жив, система отправляет SIGKILL, который принудительно завершает процесс без возможности реакции.
Пример обработки SIGTERM в bash-скрипте (например, в Entrypoint контейнера):
#!/bin/bash
# Скрипт запуска приложения (entrypoint.sh)
# Функция для graceful shutdown
graceful_shutdown() {
echo "Received SIGTERM, initiating shutdown..."
# Отправляем сигнал остановки основному процессу приложения
kill -SIGTERM ${APP_PID}
# Ждем его завершения
wait ${APP_PID}
echo "Application stopped gracefully."
exit 0
}
# Перехватываем SIGTERM
trap graceful_shutdown SIGTERM
# Запускаем основное приложение в фоне
./my-app &
APP_PID=$!
# Ждем завершения основного процесса
wait ${APP_PID}
Практические следствия для DevOps:
- Health Checks: Liveness- и Readiness-пробы в Kubernetes должны продолжаться во время graceful shutdown, чтобы балансировщик не направлял новый трафик на завершающийся pod.
- PreStop Hooks: В Kubernetes можно определить
lifecycle.preStopв спецификации контейнера, чтобы выполнить кастомные действия перед отправкой SIGTERM (например, снять узел из пула балансировщика). - Таймауты: Важно правильно настраивать
terminationGracePeriodSecondsв Pod Spec иstop_grace_periodв Docker Compose в зависимости от времени, необходимого приложению для безопасного завершения.
Необработанный SIGTERM приводит к обрыву пользовательских сессий, потере данных и проблемам с консистентностью, поэтому его корректная обработка — обязательная часть design for failure.