Команда killall: завершение процессов по имени, сигнал -9 и установка psmisc

Тестовая средаСемейство RHELAlmaLinux 9.8psmisc 23.4Учётная запись rootDebian 12 · psmisc 23.6 Обычная учётная запись (запускает killall)
Команды для процессов · планирования задачkillallРасположение/usr/bin/killallПроверено 2026-11-03

Команда killall — это команда Linux, которая выбирает запущенные процессы не по номеру процесса (PID), а по имени программы и отправляет им сигнал; если сигнал не указан, она отправляет SIGTERM (по официальному руководству). Поскольку она сразу завершает все процессы с одинаковым именем, на сервере AlmaLinux 9 мы сначала проверили с помощью pgrep и ps четыре процесса, запущенных из копий sleep под другими именами; у исполняемого файла с именем длиннее 15 символов в имени процесса остались только первые 15 символов.

killall мы запускали только для процессов xxsleep, запущенных для теста под обычной учётной записью на сервере Debian 12. В блоках результатов — вывод rpm, pgrep, ps, pidof, cat и kill, выполненных под учётной записью root на сервере AlmaLinux 9.8, и вывод killall, выполненного на сервере Debian 12. Номера процессов (PID), имена процессов, пути исполняемых файлов и имена учётных записей заменены примерами.

1️⃣ Установка команды killall

  • ↪️ Пакет psmisc и проверка версии

killall входит в пакет psmisc. Когда на сервере AlmaLinux 9.8 мы проверили через rpm, к какому пакету относится /usr/bin/killall, появилась версия psmisc 23.4.

rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killall
psmisc 23.4

В списке файлов того же пакета, просмотренном через rpm -ql, были также pstree и fuser.

Если появляется [command not found], то есть команда не найдена, установите пакет psmisc. В семействе RHEL это [dnf install psmisc], в семействе Debian — [apt install psmisc]. На сервере Debian 12 psmisc 23.6 уже был установлен, а killall находился в /usr/bin/killall.

Проверка на сервере AlmaLinux 9.8 показала, что похожая по названию pkill входит в пакет procps-ng, а kill — встроенная команда оболочки.

2️⃣ Как пользоваться командой killall

  • ↪️ Проверка целей по имени процесса

Базовая форма — [killall имя процесса]. Команда находит все запущенные процессы с указанным именем и отправляет им сигнал; если указать несколько имён, она делает то же самое для каждого имени (по официальному руководству).

Поскольку процессы с одинаковым именем завершаются все сразу, сначала проверьте через pgrep, что запущено под этим именем. Мы скопировали sleep в рабочую папку под именами xxsleep-a1, xxsleep-a2 и xxsleep-longname-x1, запустили xxsleep-a1 дважды, всего четыре процесса, и вывели номера и имена с -l.

pgrep -l xxsleep
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnam

В четвёртой строке исполняемый файл называется xxsleep-longname-x1, но имя процесса было обрезано на xxsleep-longnam.

С -a выводится вся выполненная командная строка. Два одноимённых xxsleep-a1 мы различили по последнему аргументу в секундах — 300 и 310.

pgrep -a xxsleep
2141 /root/work/xxsleep-a1 300
2142 /root/work/xxsleep-a1 310
2150 /root/work/xxsleep-a2 320
2155 /root/work/xxsleep-longname-x1 330

Чтобы найти только процессы с точно совпадающим именем, добавьте -x. Для xxsleep-a1 результатом стали два номера.

pgrep -x xxsleep-a1
2141
2142

Чтобы проверить только номера, введя одно имя как есть, используйте pidof. Поиск xxsleep-a1 вывел оба номера в одной строке.

pidof xxsleep-a1
2142 2141

ps выводит только процессы с точно совпадающим именем, если после -C указать несколько имён через запятую.

ps -o pid,comm -C xxsleep-a1,xxsleep-a2
    PID COMMAND
   2141 xxsleep-a1
   2142 xxsleep-a1
   2150 xxsleep-a2

На сервере Debian 12 мы запустили четыре процесса с теми же именами и выполнили [killall xxsleep-a1]: команда ничего не вывела и завершилась с кодом выхода 0. При повторном поиске через pgrep оба xxsleep-a1 исчезли, остались только xxsleep-a2 и xxsleep-longname-x1. Если вместо имени указать путь с косой чертой (/), команда выбирает процессы, которые выполняют этот файл, независимо от имени (по официальному руководству).

При несуществующем имени xxsleep-zz появилась строка с [no process found] после имени, и команда завершилась с кодом выхода 1. Код выхода равен 0, только если для каждого указанного имени завершён хотя бы один процесс (по официальному руководству).

killall xxsleep-zz
xxsleep-zz: no process found

Чтобы завершить только один процесс с известным номером, отправьте сигнал только этому номеру командой kill: Команда kill в Linux.

3️⃣ Параметры команды killall

  • ↪️ -e и имена из 15 символов, -i, -v, -u, -r

Когда мы прочитали из /proc/PID/comm имя процесса, запущенного как xxsleep-longname-x1, в нём остались только первые 15 символов: xxsleep-longnam.

cat /proc/2155/comm
xxsleep-longnam

Мы запустили pgrep с 16-символьным именем xxsleep-longname.

pgrep -a xxsleep-longname

Команда завершилась без вывода с кодом выхода 1, а при повторном поиске по 15-символьному xxsleep-longnam этот процесс нашёлся.

pgrep -l xxsleep-longnam
2155 xxsleep-longnam

Если killall получает имя длиннее 15 символов и есть процессы, полное имя которых она не может прочитать, целью становятся все процессы с совпадающими первыми 15 символами; с -e такие записи пропускаются (по официальному руководству). Когда на сервере Debian 12 мы указали с -e и -v первые 15 символов xxsleep-longnam, появились строки о пропуске трёх других процессов с именем, обрезанным на 15 символах, и команда завершилась на [no process found].

killall -e -v xxsleep-longnam
killall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
xxsleep-longnam: no process found

С полным именем xxsleep-longname-x1 после тех же строк о пропуске появилась строка об отправке сигнала этому процессу.

killall -e -v xxsleep-longname-x1
killall: skipping partial match quota_events_un(37)
killall: skipping partial match acpi_thermal_pm(112)
killall: skipping partial match ext4-rsv-conver(246)
Killed xxsleep-longname-x1(2155) with signal 15

С -v для каждого процесса, которому отправлен сигнал, появилась строка с именем, номером и номером сигнала.

killall -v xxsleep-a2
Killed xxsleep-a2(2150) with signal 15

-i спрашивает по каждому процессу, завершать ли его. Мы снова запустили два xxsleep-a1 и передали y и n по очереди через стандартный ввод: оба вопроса вывелись подряд в одной строке, завершился только первый xxsleep-a1, а второй остался.

printf 'y\nn\n' | killall -i xxsleep-a1
Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)

-u выбирает только процессы, принадлежащие этой учётной записи, а если имя не указано, целью становятся все процессы этой учётной записи. Когда после имени учётной записи мы указали также xxsleep-a1, сигнал ушёл только оставшемуся xxsleep-a1.

killall -v -u user xxsleep-a1
Killed xxsleep-a1(2172) with signal 15

-o и -y выбирают по времени запуска, а время записывается числом с единицей s, m, h, d, w, M или y после него, например [-o 30m].

-r читает имена как расширенные регулярные выражения. При передаче шаблона ^xxsleep-a в pgrep появились три процесса, начинающиеся с xxsleep-a.

pgrep -l '^xxsleep-a'
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2

-w ждёт, проверяя каждую секунду, пока не исчезнут все процессы, которым отправлен сигнал. Если процесс игнорирует сигнал или остаётся зомби, ожидание может не закончиться.

В первой таблице ниже — проверочные команды и параметры killall, которые действительно выполнялись в этой статье, а невыполненные параметры killall собраны во второй таблице по официальному руководству.

📌 Проверка процессов и killall: результаты этой статьи

КомандаНазначениеРезультат в этой статье
pgrep -l имяНомер и имя процессов, в имени которых оно встречаетсяДля xxsleep четыре строки; длинное имя видно только до первых 15 символов, xxsleep-longnam
pgrep -a имяНомер и вся командная строкаДва одноимённых xxsleep-a1 различаются по последним аргументам 300 и 310
pgrep -x имяТолько номера процессов с точно совпадающим именемДля xxsleep-a1 две строки: 2141 и 2142
pidof имяНомера, запущенные под этим именем, в одной строкеДля xxsleep-a1 2142 2141
ps -o pid,comm -C имяНомер и имя процессов с точно совпадающим именем; несколько имён через запятуюДве строки xxsleep-a1 и одна строка xxsleep-a2
cat /proc/PID/commИмя процесса (до первых 15 символов)2155 — это xxsleep-longnam
killall имяSIGTERM процессам с этим именемОба xxsleep-a1 завершены с кодом выхода 0; несуществующее имя xxsleep-zz дало no process found и код выхода 1
killall -e имяИмена длиннее 15 символов — только при совпадении полного имениxxsleep-longnam дало no process found, xxsleep-longname-x1 завершён
killall -v имяВыводит результат для каждого процесса, которому отправлен сигналKilled xxsleep-a2(2150) with signal 15
killall -i имяСпрашивает подтверждение по каждому процессу перед завершениемПосле ввода y и n завершился только первый xxsleep-a1
killall -u имя учётной записиТолько процессы, принадлежащие этой учётной записиВместе с именем: завершился только xxsleep-a1 этой учётной записи
killall -9 имяSIGKILL вместо SIGTERMKilled xxsleep-a2(2173) with signal 9

📎 Другие опции: по официальному руководству

ОпцияНазначение
-I, --ignore-caseСравнивает имена без учёта регистра
-g, --process-groupСигнал группе процессов вместо самого процесса (один раз на группу)
-l, --listСписок известных имён сигналов
-n, --ns PIDТолько процессы в том же пространстве имён PID, что и этот PID; по умолчанию все пространства имён
-o, --older-than времяТолько процессы, запущенные раньше этого времени (единицы s, m, h, d, w, M, y)
-q, --quietНе сообщает, даже если ни один процесс не завершён
-r, --regexpЧитает имена как расширенные регулярные выражения
-s, --signal сигналСигнал, отправляемый вместо SIGTERM
-V, --versionВыводит сведения о версии
-w, --waitЖдёт, пока не исчезнут все процессы, которым отправлен сигнал
-y, --younger-than времяТолько процессы, запущенные позже этого времени
-Z, --context шаблонТолько процессы, контекст безопасности которых совпадает с шаблоном расширенного регулярного выражения; указывается перед другими аргументами; имя можно не указывать

🔲 Симулятор команды killall

Симулятор ниже начинается со списка из четырёх процессов xxsleep и xxsleep-a2 примерной учётной записи user1. Нажимайте на чипы, чтобы сравнить, какие строки исчезают из списка при [killall -v], [-i] и [-u]; тексты вывода killall имитируют вывод, полученный на сервере Debian 12.

Симулятор команды killallpsmisc 23.4
[root@server work]#
Работает только в вашем браузере. Список слева содержит примерные значения, а killall — это имитация по текстам вывода с сервера Debian 12, которая удаляет строки только из списка.

4️⃣ Сигналы killall

  • ↪️ Параметр -s, killall -9 и номера сигналов

Отправляемый сигнал указывается по имени, например [-HUP] или [-SIGHUP], по номеру, например [-1], или после параметра -s (по официальному руководству). [killall -9 имя процесса] отправляет сигнал 9, SIGKILL. SIGKILL — сигнал, который процесс не может перехватить или проигнорировать (по официальному руководству), поэтому процесс завершается, не успев выполнить завершающие действия. Поэтому его отправляют, когда стандартный сигнал SIGTERM не завершает процесс.

Когда на сервере Debian 12 мы добавили -9 вместе с -v для снова запущенного xxsleep-a2, появилась строка с номером сигнала 9.

killall -9 -v xxsleep-a2
Killed xxsleep-a2(2173) with signal 9

Имена и номера сигналов мы проверили через [kill -l]. У killall тоже есть параметр -l, который выводит известные ей имена сигналов.

kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

При вводе одного номера выводилось только имя этого сигнала. 15, который killall отправляет по умолчанию, — это TERM, а 9, отправляемый с -9, — KILL.

kill -l 15
TERM
kill -l 9
KILL

Если указать имя сигнала, которого нет в списке, появится сообщение вида [FOO: unknown signal; killall -l lists signals.] (по официальному руководству и текстам программы).

🔢 FAQ & рекомендуемые материалы

killall — команда из пакета psmisc, а pkill — из пакета procps-ng, того же, что и pgrep. pkill, как и pgrep, ищет часть имени как расширенное регулярное выражение, а killall читает имена как регулярные выражения только с -r (по официальному руководству).

В официальном руководстве psmisc сказано, что в системах, отличных от Linux, [killall имя] может работать не так, как ожидается, и что при запуске под учётной записью администратора нужно быть особенно осторожным. В других системах сначала проверьте руководство этой системы.

Число имён, которые можно указать за один раз, ограничено: это размер целого unsigned long, умноженный на 8. В 64-битных системах обычно 64, в 32-битных — 32 (по официальному руководству).

ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 2   +   8   =