Что такое сигналы в Linux?

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

Ответ

Сигналы — это механизм межпроцессного взаимодействия (IPC) в Linux, позволяющий ядру или одному процессу асинхронно уведомить другой процесс о наступлении какого-либо события.

Основные сигналы и их использование в DevOps:

  • SIGTERM (15) — запрос на корректное завершение. Демоны и приложения должны перехватить его, чтобы выполнить graceful shutdown (завершить соединения, сохранить состояние).
  • SIGKILL (9) — принудительное немедленное завершение процесса. Не может быть перехвачен или проигнорирован. Используется как последняя мера, когда SIGTERM не сработал.
  • SIGHUP (1) — часто интерпретируется демонами (например, nginx, haproxy) как сигнал к перечитыванию конфигурационных файлов без полной перезагрузки.
  • SIGINT (2) — отправляется при нажатии Ctrl+C в терминале.

Практический пример: При написании скриптов для управления сервисами важно правильно обрабатывать сигналы, чтобы обеспечить чистую остановку. Вот пример bash-скрипта, который ловит SIGTERM:

#!/bin/bash
# Функция-обработчик для graceful shutdown
cleanup() {
    echo "Получен SIGTERM, выполняю cleanup..."
    # Остановка фоновых процессов, закрытие соединений и т.д.
    kill -TERM $child_pid 2>/dev/null
    wait $child_pid
    exit 0
}

# Назначаем функцию cleanup обработчиком для SIGTERM
trap cleanup SIGTERM

# Запускаем основной процесс в фоне
./my_app &
child_pid=$!

# Ожидаем завершения основного процесса
wait $child_pid

Важно для DevOps:

  • В оркестраторах (Kubernetes, Docker) при остановке пода сначала отправляется SIGTERM, и только после истечения таймаута — SIGKILL. Этот таймаут (terminationGracePeriodSeconds в k8s) должен быть достаточным для graceful shutdown вашего приложения.
  • Сигналы SIGKILL и SIGSTOP нельзя перехватить или проигнорировать.
  • Номера сигналов можно посмотреть командой kill -l.