linux processes

kill

Отправить сигнал процессу — управление процессами через POSIX-сигналы

Описание

kill — команда для отправки сигналов процессам. Несмотря на название, kill не обязательно завершает процесс: она отправляет сигнал указанному PID, а что делать с сигналом — решает сам процесс (кроме сигналов SIGKILL и SIGSTOP, которые нельзя перехватить). По умолчанию (без указания сигнала) отправляется SIGTERM — вежливая просьба завершиться.

Механизм сигналов — один из фундаментальных механизмов IPC (Inter-Process Communication) в Unix. Сигналы используются для: завершения процессов, перезагрузки конфигурации без перезапуска (SIGHUP), приостановки и возобновления (SIGSTOP/SIGCONT), уведомления о таймерах и событиях ввода-вывода.

Помимо встроенной команды оболочки, в системе есть внешний /usr/bin/kill (из пакета procps), а также родственные команды: killall (по имени), pkill (по шаблону имени/атрибутам), xkill (по клику на окно в X11).

Синтаксис

kill [signal] PID [PID ...]

Сигнал можно указать тремя способами:

kill -SIGTERM 1234 # по полному имени kill -TERM 1234 # по короткому имени (без SIG-) kill -15 1234 # по номеру сигнала

Связанные команды:

killall nginx # завершить все процессы с именем nginx pkill -f "python app" # завершить по шаблону командной строки pgrep nginx # найти PID по имени (без завершения) pgrep -la nginx # найти PID + вывести командную строку

Флаги и опции

Флаг / СигналОписание
-lСписок всех доступных сигналов с номерами. Пример: kill -l
-l NПоказать имя сигнала по номеру. Пример: kill -l 9 → KILL
-s signalЯвно указать сигнал по имени. Пример: kill -s TERM 1234

Основные сигналы:

СигналНомерОписание
SIGHUP1Hang up — перечитать конфигурацию (для демонов), или завершить процесс если HUP не обрабатывается
SIGINT2Interrupt — прерывание с клавиатуры (аналог Ctrl+C). Процесс может перехватить и обработать
SIGQUIT3Quit — завершение с дампом памяти (core dump). Аналог Ctrl+\
SIGKILL9Kill — немедленное принудительное завершение. Нельзя перехватить, заблокировать или игнорировать
SIGTERM15Terminate — вежливая просьба завершиться. Сигнал по умолчанию. Процесс может перехватить и выполнить cleanup
SIGSTOP19Stop — приостановить процесс (нельзя перехватить). Аналог Ctrl+Z в терминале
SIGCONT18Continue — возобновить приостановленный процесс
SIGUSR110User-defined 1 — пользовательский сигнал. Nginx: reload workers; Apache: graceful restart
SIGUSR212User-defined 2 — второй пользовательский сигнал (значение зависит от приложения)
SIGCHLD17Child — уведомление родителю об изменении состояния дочернего процесса
SIGWINCH28Window 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

Советы и предупреждения

Совет: всегда начинайте с SIGTERM
Правильный порядок: сначала kill PID (SIGTERM), подождать 3–5 секунд, и только если процесс не завершился — kill -9 PID. SIGTERM даёт процессу возможность корректно завершить транзакции, закрыть файлы, записать логи. SIGKILL обрывает всё немедленно — это может привести к повреждению данных.
Совет: pkill удобнее kill для именованных процессов
Вместо цепочки ps aux | grep nginx | awk '{print $2}' | xargs kill используйте pkill nginx или pkill -f "описание". Флаг -f ищет по полной командной строке, а не только по имени процесса.
Внимание: SIGKILL (-9) не позволяет cleanup
После kill -9 процесс не сможет записать данные, закрыть соединения с базой или удалить временные файлы. Базы данных могут потребовать восстановления при следующем запуске. Используйте SIGKILL только как крайнюю меру, когда SIGTERM не помогает.
Внимание: kill без прав суперпользователя
Обычный пользователь может отправить сигнал только своим процессам. Попытка завершить процесс другого пользователя вызовет ошибку Operation not permitted. Для чужих процессов нужен sudo kill PID.