Как обработать сигналы ОС в Python?python-39

Сигналы ОС — это механизм для асинхронной коммуникации между процессами и ОС. В Python для работы с ними используется модуль signal. Вот как это работает:

Основы работы с сигналами

  1. Импорт модуля:
import signal
  1. Основные сигналы:
    • signal.SIGINT (Interrupt) — Ctrl+C
    • signal.SIGTERM (Terminate) — запрос на завершение
    • signal.SIGKILL (Kill) — немедленное завершение (нельзя перехватить)
    • signal.SIGALRM (Alarm) — таймер

Обработка сигналов

import signal
import time

def handler(signum, frame):
    print(f"Получен сигнал {signum}")
    # Какая-то логика обработки
    if signum == signal.SIGINT:
        print("Завершаем работу...")
        exit(0)

# Регистрируем обработчик
signal.signal(signal.SIGINT, handler)

print("Ожидаем сигнал...")
while True:
    time.sleep(1)

Важные моменты:

  1. handler — функция-обработчик принимает:
    • signum — номер сигнала
    • frame — текущий стек вызовов
  2. Не все сигналы можно перехватить (например, SIGKILL)
  3. Обработчики должны быть простыми и быстрыми

Продвинутые техники

Таймеры через SIGALRM

def timeout_handler(signum, frame):
    raise TimeoutError("Время выполнения истекло")

signal.signal(signal.SIGALRM, timeout_handler)
signal.alarm(5)  # Таймер на 5 секунд

Игнорирование сигналов

signal.signal(signal.SIGINT, signal.SIG_IGN)

Восстановление дефолтного обработчика

signal.signal(signal.SIGINT, signal.SIG_DFL)

Ограничения

  1. Работает только в основном потоке
  2. Не подходит для сложной асинхронной логики
  3. В Windows поддерживаются не все сигналы

Альтернативы

Для сложных сценариев лучше использовать:

  • asyncio + loop.add_signal_handler()
  • Мультипроцессорные решения

Резюмируем

модуль signal предоставляет базовый API для работы с сигналами ОС, но требует аккуратного использования. Для простых сценариев остановки/перехвата команд достаточно стандартного функционала, для сложных — лучше рассмотреть альтернативы.