Команда killall: завершение процессов по имени, сигнал -9 и установка psmisc
Команда 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
killall входит в пакет psmisc. Когда на сервере AlmaLinux 9.8 мы проверили через rpm, к какому пакету относится /usr/bin/killall, появилась версия psmisc 23.4.
rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killallpsmisc 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 xxsleep2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnamВ четвёртой строке исполняемый файл называется xxsleep-longname-x1, но имя процесса было обрезано на xxsleep-longnam.
С -a выводится вся выполненная командная строка. Два одноимённых xxsleep-a1 мы различили по последнему аргументу в секундах — 300 и 310.
pgrep -a xxsleep2141 /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-a12141
2142Чтобы проверить только номера, введя одно имя как есть, используйте pidof. Поиск xxsleep-a1 вывел оба номера в одной строке.
pidof xxsleep-a12142 2141ps выводит только процессы с точно совпадающим именем, если после -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-zzxxsleep-zz: no process foundЧтобы завершить только один процесс с известным номером, отправьте сигнал только этому номеру командой kill: Команда kill в Linux.
3️⃣ Параметры команды killall
Когда мы прочитали из /proc/PID/comm имя процесса, запущенного как xxsleep-longname-x1, в нём остались только первые 15 символов: xxsleep-longnam.
cat /proc/2155/commxxsleep-longnamМы запустили pgrep с 16-символьным именем xxsleep-longname.
pgrep -a xxsleep-longnameКоманда завершилась без вывода с кодом выхода 1, а при повторном поиске по 15-символьному xxsleep-longnam этот процесс нашёлся.
pgrep -l xxsleep-longnam2155 xxsleep-longnamЕсли killall получает имя длиннее 15 символов и есть процессы, полное имя которых она не может прочитать, целью становятся все процессы с совпадающими первыми 15 символами; с -e такие записи пропускаются (по официальному руководству). Когда на сервере Debian 12 мы указали с -e и -v первые 15 символов xxsleep-longnam, появились строки о пропуске трёх других процессов с именем, обрезанным на 15 символах, и команда завершилась на [no process found].
killall -e -v xxsleep-longnamkillall: 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-x1killall: 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-a2Killed xxsleep-a2(2150) with signal 15-i спрашивает по каждому процессу, завершать ли его. Мы снова запустили два xxsleep-a1 и передали y и n по очереди через стандартный ввод: оба вопроса вывелись подряд в одной строке, завершился только первый xxsleep-a1, а второй остался.
printf 'y\nn\n' | killall -i xxsleep-a1Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)-u выбирает только процессы, принадлежащие этой учётной записи, а если имя не указано, целью становятся все процессы этой учётной записи. Когда после имени учётной записи мы указали также xxsleep-a1, сигнал ушёл только оставшемуся xxsleep-a1.
killall -v -u user xxsleep-a1Killed 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 вместо SIGTERM | Killed 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.
4️⃣ Сигналы killall
Отправляемый сигнал указывается по имени, например [-HUP] или [-SIGHUP], по номеру, например [-1], или после параметра -s (по официальному руководству). [killall -9 имя процесса] отправляет сигнал 9, SIGKILL. SIGKILL — сигнал, который процесс не может перехватить или проигнорировать (по официальному руководству), поэтому процесс завершается, не успев выполнить завершающие действия. Поэтому его отправляют, когда стандартный сигнал SIGTERM не завершает процесс.
Когда на сервере Debian 12 мы добавили -9 вместе с -v для снова запущенного xxsleep-a2, появилась строка с номером сигнала 9.
killall -9 -v xxsleep-a2Killed 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 15TERMkill -l 9KILLЕсли указать имя сигнала, которого нет в списке, появится сообщение вида [FOO: unknown signal; killall -l lists signals.] (по официальному руководству и текстам программы).
🔢 FAQ & рекомендуемые материалы
Проверка в реальном времени
Команда top в Linux (проверка загрузки CPU и памяти)
Команда, которая в реальном времени показывает, сколько CPU и памяти использует каждый процесс.
Управление заданиями
Фоновый (Back Ground) и основной (Fore Ground) режимы в Linux: управление процессами
Способ управления заданиями: отправить команду в фон и вернуть её на передний план.
Открытые файлы
[Linux] Команда lsof: вывод сведений об используемых файлах
Команда, которая показывает файлы и сокеты, открытые процессом, вместе с его PID.
ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.