← Назад к вопросам

В чем различия SIGKILL и SIGTERM?

1.8 Middle🔥 91 комментариев
#DevOps и инфраструктура

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Различия SIGKILL и SIGTERM

Это два разных сигнала операционной системы для завершения процесса. Понимание их различий критично для написания надежного кода на Python.

SIGTERM — "Вежливое" завершение

SIGTERM означает "terminate". Это сигнал просьбы:

# Процесс получает сигнал и может:
import signal
import sys

def handle_sigterm(signum, frame):
    print("Получен SIGTERM, начинаю корректное завершение")
    # Закрываю файлы
    # Завершаю сетевые соединения
    # Даю потокам завершиться
    # Сохраняю состояние
    sys.exit(0)

signal.signal(signal.SIGTERM, handle_sigterm)

Ключевые особенности SIGTERM:

  • Процесс может перехватить и обработать сигнал
  • Процесс может проигнорировать сигнал (по умолчанию это не рекомендуется, но можно)
  • Дает процессу время на корректное завершение
  • Является стандартом для graceful shutdown

SIGKILL — "Насильственное" завершение

SIGKILL означает "kill". Это приказ, не просьба:

# В shell это выглядит так:
kill -TERM 1234   # SIGTERM - вежливо
kill -KILL 1234   # SIGKILL - насильственно

Ключевые особенности SIGKILL:

  • Процесс НЕ может перехватить или обработать SIGKILL
  • ОС немедленно прерывает процесс
  • Никакого graceful shutdown
  • Процесс не успевает закрыть файлы, соединения, очистить ресурсы

Сравнительная таблица

ПараметрSIGTERMSIGKILL
Номер сигнала159
Можно перехватить✅ Да❌ Нет
Можно игнорировать✅ Да❌ Нет
Дает время на cleanup✅ Да❌ Нет
ИспользованиеНормальное завершениеПоследняя мера

Практический пример

import signal
import time
import sys
from contextlib import contextmanager

class DatabaseConnection:
    def __init__(self):
        self.connected = False
    
    def connect(self):
        self.connected = True
        print("БД: подключено")
    
    def close(self):
        if self.connected:
            print("БД: корректно закрыто")
            self.connected = False

db = DatabaseConnection()

def graceful_shutdown(signum, frame):
    print(f"\nПолучен сигнал {signum}")
    db.close()  # Закрываем БД
    print("Завершение...")
    sys.exit(0)

# Регистрируем обработчик SIGTERM
signal.signal(signal.SIGTERM, graceful_shutdown)
# Также для Ctrl+C
signal.signal(signal.SIGINT, graceful_shutdown)

db.connect()
print("Приложение запущено. Нажми Ctrl+C или отправь SIGTERM")

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    pass

Правильный паттерн запуска

# Правильно: даёшь процессу время на shutdown
kill -TERM $PID
sleep 5

# Если не завершился - тогда уже SIGKILL
kill -KILL $PID 2>/dev/null || true

В контексте Docker

FROM python:3.11

COPY app.py /app/
WORKDIR /app

# Docker отправляет SIGTERM при остановке контейнера
# Приложение должно корректно его обработать
CMD ["python", "app.py"]

Когда использовать SIGKILL

SIGKILL — это последняя мера:

  • Процесс зависает и не реагирует на SIGTERM
  • Процесс "обезумел" и использует 100% ресурсов
  • Требуется немедленное завершение (критическая ошибка)

Обычно в нормальном коде вы никогда не отправляете SIGKILL сам.

Заключение

SIGTERM — это вежливое "пожалуйста, завершись", которое дает процессу возможность подготовиться.

SIGKILL — это приказ "немедленно прерваться", обойти все обработчики и очистку.

Профессиональное приложение должно корректно обрабатывать SIGTERM для graceful shutdown.

В чем различия SIGKILL и SIGTERM? | PrepBro