← Весь справочник

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 с теми же основными опциями.

Сигналы

Сигнал№Действие по умолчаниюКогда используют
HUP1завершитьтерминал закрылся; многие демоны (nginx, sshd) по HUP перечитывают конфиг
INT2завершитьто, что посылает Ctrl+C
QUIT3завершить с core dumpCtrl+\
KILL9убить немедленнопоследнее средство: нельзя перехватить и проигнорировать
USR1 / USR210 / 12завершитьна усмотрение программы: переоткрыть логи, вывести статистику
PIPE13завершитьзапись в закрытый канал (yes | head)
TERM15завершитьвежливая просьба завершиться, сигнал по умолчанию; программа может прибраться
CHLD17игнорироватьдочерний процесс завершился
CONT18продолжитьвозобновить остановленный процесс
STOP19остановитьзаморозить процесс; нельзя перехватить
TSTP20остановить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