← Назад к вопросам
В чем различия 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
- Процесс не успевает закрыть файлы, соединения, очистить ресурсы
Сравнительная таблица
| Параметр | SIGTERM | SIGKILL |
|---|---|---|
| Номер сигнала | 15 | 9 |
| Можно перехватить | ✅ Да | ❌ Нет |
| Можно игнорировать | ✅ Да | ❌ Нет |
| Дает время на 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.