Для чего нужен сигнал SIGTERM в Linux и DevOps?

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

Ответ

SIGTERM — это сигнал, который операционная система отправляет процессу с запросом на корректное завершение (graceful shutdown). В контексте DevOps и контейнеризации правильная обработка SIGTERM критически важна для обеспечения нулевого времени простоя (zero-downtime) при деплоях, масштабировании и обслуживании инфраструктуры.

Как это работает в пайплайнах и оркестраторах:

  1. Когда я выполняю kubectl delete pod, docker stop, или когда Horizontal Pod Autoscaler решает уменьшить количество реплик, оркестратор сначала отправляет контейнеру SIGTERM.
  2. У приложения есть grace period (по умолчанию 30 секунд в Kubernetes) на то, чтобы завершить текущие операции: дообработать HTTP-запросы, закрыть соединения с БД, сохранить состояние на диск, остановить дочерние процессы.
  3. Если по истечении таймаута процесс еще жив, система отправляет 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.