В контейнере сигнал SIGTERM — это стандартный способ аккуратно завершить процесс, который используют Docker и оркестраторы перед остановкой или перезапуском. Если его не обрабатывать, процесс часто добивают SIGKILL, без шанса завершить запросы и сохранить состояние. Корректная обработка SIGTERM даёт предсказуемое и безопасное для данных завершение сервиса при деплое и масштабировании.
В контейнерной среде (Docker, Kubernetes и др.) сигнал SIGTERM — это основной механизм "вежливого" завершения приложения. Типичный сценарий выглядит так: оркестратор посылает контейнеру SIGTERM и даёт ограниченное время (grace period) на корректное завершение; если процесс не вышел сам, ему посылают SIGKILL, который немедленно убивает процесс без какого‑либо кода в приложении.
Если приложение внутри контейнера не обрабатывает SIGTERM, оно может быть остановлено посреди обработки запроса или транзакции. Это приводит к потере или порче данных, оборванным HTTP/gRPC‑запросам, незакрытым соединениям с БД, оставленным блокировкам и другим "хвостам", которые потом трудно диагностировать. Кроме того, клиенты могут получать неожиданные ошибки во время rolling‑обновлений или масштабирования.
Особенность контейнеров в том, что ваше приложение зачастую запускается как процесс PID 1 внутри namespace. PID 1 в Linux по‑особому относится к сигналам и управлению дочерними процессами: если явно не настроить обработку сигналов и не забирать зомби‑процессы, можно получить зависания и утечки процессов. Поэтому либо нужно явно обрабатывать SIGTERM в приложении, либо использовать init‑процесс (например, tini или dumb-init), который корректно проксирует сигналы и убирает зомби.
Грамотная обработка SIGTERM обычно включает несколько шагов: перестать принимать новые запросы (например, остановить HTTP‑листенер или выдать readiness=fail в Kubernetes), дождаться завершения текущих операций, аккуратно закрыть сетевые соединения и сохранить критичное состояние, а затем выйти с корректным кодом возврата в пределах отведённого таймаута. В результате остановка контейнера становится управляемой и предсказуемой частью жизненного цикла сервиса.
Ниже — простой пример bash‑скрипта, работающего в контейнере и корректно реагирующего на SIGTERM с помощью trap:
А вот пример на Python: регистрируем обработчик SIGTERM, который ставит флаг завершения, даёт основному циклу спокойно доработать и только потом выполняет финальную очистку ресурсов и выход:
Отметьте свой прогресс