Ответ
Сигналы — это механизм межпроцессного взаимодействия (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.