Что такое сигнал
Сигнал - это маленькое целое-число-уведомление, которое ядро доставляет процессу. Процесс может обработать сигнал (поставить handler), проигнорировать или ничего не делать - тогда работает действие по умолчанию (которое обычно «завершиться»).
Самые важные сигналы
| сигнал | № | дефолтное действие | когда отправляется |
|---|---|---|---|
| SIGHUP | 1 | terminate | TTY закрылась; сервисам - «перечитай конфиг» |
| SIGINT | 2 | terminate | Ctrl+C в терминале |
| SIGQUIT | 3 | core dump | Ctrl+\ |
| SIGKILL | 9 | terminate | прямое уничтожение, нельзя обработать или проигнорировать |
| SIGTERM | 15 | terminate | стандартное «завершись пожалуйста» |
| SIGSTOP | 19 | stop | приостановить, нельзя обработать |
| SIGCONT | 18 | continue | продолжить остановленный |
| SIGUSR1/2 | 10/12 | terminate | для приложения; часто используется чтобы дать команду без перезапуска |
| SIGPIPE | 13 | terminate | пишешь в pipe чей читатель закрылся |
| SIGCHLD | 17 | ignore | дочерний процесс завершился - wait() надо |
| SIGSEGV | 11 | core dump | обращение к невалидной памяти |
Правильный паттерн остановки
Сначала TERM, дай несколько секунд на graceful-завершение, потом KILL:
kill <pid> # послать TERM
sleep 5
kill -KILL <pid> # если ещё жив - добить
Хороший сервис на TERM закрывает приёмные сокеты, доделывает текущие
запросы, скидывает буферы, сохраняет state. Прямой kill -9 рвёт это всё -
потерянные транзакции, битые файлы, висящие БД-локи.
Когда какой сигнал использовать
- TERM - обычное «остановись», твой default
- KILL - только если TERM не сработал
- HUP для daemons - «перечитай конфиг» (nginx, syslog)
- USR1/2 - приложение может дать что угодно: например, nginx USR1 = ротация лога
- STOP/CONT - пауза/возобновление; полезно для long-running batch'ей
Где это всё настраивается
В bash сигналы переопределяются через trap:
trap 'echo got SIGINT; exit 1' INT
trap 'cleanup; exit' EXIT