# Сигналы (SIGTERM, SIGKILL, SIGHUP) _Процессы и ресурсы · LinuxLab Knowledge Base_ **TL;DR:** Сигнал - асинхронное уведомление процессу от ядра или другого процесса. TERM - попроси завершиться, KILL - убей сразу, HUP - перечитай конфиг. ## Что такое сигнал Сигнал - это маленькое целое-число-уведомление, которое ядро доставляет процессу. Процесс может **обработать** сигнал (поставить 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**: ```bash kill # послать TERM sleep 5 kill -KILL # если ещё жив - добить ``` Хороший сервис на TERM закрывает приёмные сокеты, доделывает текущие запросы, скидывает буферы, сохраняет state. Прямой `kill -9` рвёт это всё - потерянные транзакции, битые файлы, висящие БД-локи. ## Когда какой сигнал использовать - **TERM** - обычное «остановись», твой default - **KILL** - только если TERM не сработал - **HUP** для daemons - «перечитай конфиг» (nginx, syslog) - **USR1/2** - приложение может дать что угодно: например, nginx USR1 = ротация лога - **STOP/CONT** - пауза/возобновление; полезно для long-running batch'ей ## Где это всё настраивается В bash сигналы переопределяются через `trap`: ```bash trap 'echo got SIGINT; exit 1' INT trap 'cleanup; exit' EXIT ``` ## Команды ```bash kill -l ``` Список всех сигналов с номерами ```bash kill -TERM 1234 ``` Послать SIGTERM конкретному PID ```bash pkill -HUP nginx ``` Послать SIGHUP всем процессам по имени (nginx → перечитать конфиг) ```bash killall -9 chrome ``` По имени, всем процессам, форсированно SIGKILL - крайняя мера ```bash trap 'echo bye' EXIT ``` В bash установить обработчик сигнала EXIT - выполнится при завершении шелла ## См. также - [Процесс и PID](/kb/process-and-pid.md) - [OOM killer](/kb/oom-killer.md) - [ps - снимок процессов](/kb/cmd-ps.md) - [htop - интерактивный монитор процессов](/kb/cmd-htop.md)