kill
Отправить процессу сигнал — вежливо завершить, убить, перечитать конфиг, приостановить
kill не обязательно убивает — он отправляет сигнал процессу по PID. Что произойдёт дальше, решает процесс: большинство сигналов можно перехватить или проигнорировать. По умолчанию отправляется TERM — просьба завершиться.
Синтаксис
kill [-сигнал] PID…
kill -s сигнал PID…
kill -l [номер]
Сигнал можно указать именем с префиксом SIG или без него, либо номером: kill -TERM, kill -SIGTERM, kill -15, kill -s TERM — одно и то же.
Опции
| Опция | Что делает |
|---|---|
-СИГНАЛ / -N | какой сигнал отправить (по умолчанию TERM) |
-s СИГНАЛ | то же, отдельным аргументом |
-l | список сигналов; kill -l 15 → TERM, kill -l 137 → KILL (переводит код 128+N) |
-L | таблица сигналов (только /bin/kill) |
-0 | ничего не отправлять, только проверить: процесс существует и тебе можно слать ему сигналы |
%1 | вместо PID — номер задания оболочки (jobs) |
-- -PGID | отрицательное число — сигнал всей группе процессов |
kill обычно встроен в bash; есть и отдельная программа /bin/kill из procps с теми же основными опциями.
Сигналы
| Сигнал | № | Действие по умолчанию | Когда используют |
|---|---|---|---|
HUP | 1 | завершить | терминал закрылся; многие демоны (nginx, sshd) по HUP перечитывают конфиг |
INT | 2 | завершить | то, что посылает Ctrl+C |
QUIT | 3 | завершить с core dump | Ctrl+\ |
KILL | 9 | убить немедленно | последнее средство: нельзя перехватить и проигнорировать |
USR1 / USR2 | 10 / 12 | завершить | на усмотрение программы: переоткрыть логи, вывести статистику |
PIPE | 13 | завершить | запись в закрытый канал (yes | head) |
TERM | 15 | завершить | вежливая просьба завершиться, сигнал по умолчанию; программа может прибраться |
CHLD | 17 | игнорировать | дочерний процесс завершился |
CONT | 18 | продолжить | возобновить остановленный процесс |
STOP | 19 | остановить | заморозить процесс; нельзя перехватить |
TSTP | 20 | остановить | Ctrl+Z; в отличие от STOP, можно перехватить |
Номера указаны для Linux на x86_64 и ARM; на других архитектурах некоторые отличаются, поэтому в скриптах надёжнее имена. Процесс, убитый сигналом N, завершается с кодом 128+N: TERM → 143, KILL → 137, INT → 130.
Примеры
# вежливо завершить процесс
kill 1234
# если не помогло через несколько секунд — убить
kill -9 1234
# перечитать конфигурацию демона без перезапуска
kill -HUP "$(cat /run/nginx.pid)"
# приостановить и возобновить
kill -STOP 1234
kill -CONT 1234
# жив ли процесс (ничего не отправляет)
if kill -0 1234 2>/dev/null; then echo "работает"; fi
# какой сигнал прячется за кодом 137
kill -l 137 # KILL
# фоновое задание оболочки
sleep 100 &
kill %1
# PID последнего фонового процесса и его код после завершения
sleep 100 & pid=$!
kill "$pid"; wait "$pid"; echo $? # 143
# всей группе процессов (например, скрипту и его детям)
kill -TERM -- -4321
Подводные камни
- Не начинай с
-9.KILLне даёт процессу закрыть файлы, удалить PID-файл и lock-и, сбросить буферы. СначалаTERM, подожди, и только потомKILL. killубивает только указанный процесс, не его детей. Дети осиротеют и перейдут к PID 1. Чтобы задеть всех, шли сигнал группе:kill -- -PGID.- Процесс в состоянии
Dне реагирует даже наKILL, пока не вернётся из ядра (обычно ждёт диск или NFS). Зомби (Z) убить нельзя вовсе — он уже завершён. - Процесс может игнорировать сигнал.
trap '' TERMв скрипте, иkillничего не сделает. Посмотреть маску игнорируемых сигналов: строкаSigIgnв/proc/<pid>/status. - Фоновые процессы, запущенные из скрипта, игнорируют
INTиQUIT(так bash делает, когда нет управления заданиями). Им шлиTERM. - PID может смениться хозяином. Между
psиkillпроцесс мог завершиться, а его номер — достаться другому. Убивай по свежему PID или черезpkillс точным шаблоном. kill -0возвращает ошибку и для чужого процесса, если у тебя нет прав, — это не значит, что процесса нет.killallв образе не установлен; убивать по имени — черезpkill.
См. также
pgrep · ps · exit-codes · service