kill
Отправить сигнал процессу — управление процессами через POSIX-сигналы
Описание
kill — команда для отправки сигналов процессам. Несмотря на название, kill не обязательно завершает процесс: она отправляет сигнал указанному PID, а что делать с сигналом — решает сам процесс (кроме сигналов SIGKILL и SIGSTOP, которые нельзя перехватить). По умолчанию (без указания сигнала) отправляется SIGTERM — вежливая просьба завершиться.
Механизм сигналов — один из фундаментальных механизмов IPC (Inter-Process Communication) в Unix. Сигналы используются для: завершения процессов, перезагрузки конфигурации без перезапуска (SIGHUP), приостановки и возобновления (SIGSTOP/SIGCONT), уведомления о таймерах и событиях ввода-вывода.
Помимо встроенной команды оболочки, в системе есть внешний /usr/bin/kill (из пакета procps), а также родственные команды: killall (по имени), pkill (по шаблону имени/атрибутам), xkill (по клику на окно в X11).
Синтаксис
Сигнал можно указать тремя способами:
Связанные команды:
Флаги и опции
| Флаг / Сигнал | Описание |
|---|---|
-l | Список всех доступных сигналов с номерами. Пример: kill -l |
-l N | Показать имя сигнала по номеру. Пример: kill -l 9 → KILL |
-s signal | Явно указать сигнал по имени. Пример: kill -s TERM 1234 |
Основные сигналы:
| Сигнал | Номер | Описание |
|---|---|---|
SIGHUP | 1 | Hang up — перечитать конфигурацию (для демонов), или завершить процесс если HUP не обрабатывается |
SIGINT | 2 | Interrupt — прерывание с клавиатуры (аналог Ctrl+C). Процесс может перехватить и обработать |
SIGQUIT | 3 | Quit — завершение с дампом памяти (core dump). Аналог Ctrl+\ |
SIGKILL | 9 | Kill — немедленное принудительное завершение. Нельзя перехватить, заблокировать или игнорировать |
SIGTERM | 15 | Terminate — вежливая просьба завершиться. Сигнал по умолчанию. Процесс может перехватить и выполнить cleanup |
SIGSTOP | 19 | Stop — приостановить процесс (нельзя перехватить). Аналог Ctrl+Z в терминале |
SIGCONT | 18 | Continue — возобновить приостановленный процесс |
SIGUSR1 | 10 | User-defined 1 — пользовательский сигнал. Nginx: reload workers; Apache: graceful restart |
SIGUSR2 | 12 | User-defined 2 — второй пользовательский сигнал (значение зависит от приложения) |
SIGCHLD | 17 | Child — уведомление родителю об изменении состояния дочернего процесса |
SIGWINCH | 28 | Window change — изменился размер терминала (используют ncurses-приложения) |
Паттерны использования
Вежливое и принудительное завершение
# Шаг 1: вежливо (SIGTERM) kill 1234 # Дать время на cleanup (несколько секунд) # Шаг 2: если не завершился — принудительно kill -9 1234 # Комбо: TERM, подождать, KILL kill 1234; sleep 3; kill -9 1234 2>/dev/null
Reload конфигурации без перезапуска
# Nginx: перечитать конфигурацию kill -HUP $(cat /var/run/nginx.pid) # или pkill -HUP nginx # PostgreSQL: reload pg_hba.conf kill -HUP $(cat /var/run/postgresql/*.pid) # Любой демон, поддерживающий SIGHUP kill -1 $(pgrep sshd)
Найти и завершить по имени
# killall: по точному имени killall firefox # pkill: по шаблону имени pkill -f "python manage.py" # pkill с сигналом pkill -9 -f "runserver" # Проверить, что нашли нужное pgrep -la python
Приостановить и возобновить
# Приостановить тяжёлый процесс kill -STOP 1234 # Процесс заморожен, не потребляет CPU # Возобновить kill -CONT 1234 # Применение: приоритетная задача # занимает CPU, надо освободить временно
Завершить все дочерние процессы
# Убить группу процессов (знак минус = PGID) kill -TERM -1234 # -PGID # Получить PGID процесса ps -o pgid= -p 1234 # Завершить все процессы пользователя # (осторожно!) pkill -u someuser
Проверить PID перед отправкой сигнала
# Безопасный паттерн в скрипте
PID=$(pgrep -x myapp)
if [ -n "$PID" ]; then
kill -TERM "$PID"
echo "Sent SIGTERM to PID $PID"
else
echo "Process not found"
fi
Советы и предупреждения
Правильный порядок: сначала
kill PID (SIGTERM), подождать 3–5 секунд, и только если процесс не завершился — kill -9 PID. SIGTERM даёт процессу возможность корректно завершить транзакции, закрыть файлы, записать логи. SIGKILL обрывает всё немедленно — это может привести к повреждению данных.
Вместо цепочки
ps aux | grep nginx | awk '{print $2}' | xargs kill используйте pkill nginx или pkill -f "описание". Флаг -f ищет по полной командной строке, а не только по имени процесса.
После
kill -9 процесс не сможет записать данные, закрыть соединения с базой или удалить временные файлы. Базы данных могут потребовать восстановления при следующем запуске. Используйте SIGKILL только как крайнюю меру, когда SIGTERM не помогает.
Обычный пользователь может отправить сигнал только своим процессам. Попытка завершить процесс другого пользователя вызовет ошибку
Operation not permitted. Для чужих процессов нужен sudo kill PID.