Polecenie killall: kończenie procesów po nazwie, sygnał -9 i instalacja psmisc
Polecenie killall to polecenie Linuksa, które wybiera działające procesy po nazwie programu zamiast po numerze procesu (PID) i wysyła do nich sygnał; jeśli nie podasz sygnału, wysyła SIGTERM (według oficjalnego podręcznika). Ponieważ kończy naraz wszystkie procesy o tej samej nazwie, na serwerze AlmaLinux 9 najpierw sprawdziliśmy poleceniami pgrep i ps cztery procesy uruchomione z kopii sleep pod innymi nazwami; w przypadku pliku wykonywalnego o nazwie dłuższej niż 15 znaków w nazwie procesu zostało tylko pierwsze 15 znaków.
killall uruchomiliśmy tylko na procesach xxsleep uruchomionych do testów na zwykłym koncie na serwerze Debian 12. Ramki z wynikami pokazują wyjście rpm, pgrep, ps, pidof, cat i kill uruchomionych na koncie root na serwerze AlmaLinux 9.8 oraz wyjście killall uruchomionego na serwerze Debian 12. Numery procesów (PID), nazwy procesów, ścieżki plików wykonywalnych i nazwy kont zastąpiono przykładowymi wartościami.
1️⃣ Instalacja polecenia killall
killall należy do pakietu psmisc. Gdy na serwerze AlmaLinux 9.8 sprawdziliśmy za pomocą rpm, do którego pakietu należy /usr/bin/killall, pojawiła się wersja psmisc 23.4.
rpm -qf --qf '%{NAME} %{VERSION}\n' /usr/bin/killallpsmisc 23.4Lista plików tego samego pakietu, wyświetlona przez rpm -ql, zawierała też pstree i fuser.
Jeśli pojawi się [command not found], czyli że polecenia nie znaleziono, zainstaluj pakiet psmisc. W rodzinie RHEL to [dnf install psmisc], a w rodzinie Debian [apt install psmisc]. Na serwerze Debian 12 psmisc 23.6 był już zainstalowany, a killall znajdował się w /usr/bin/killall.
Sprawdzenie na serwerze AlmaLinux 9.8 pokazało, że pkill o podobnej nazwie należy do pakietu procps-ng, a kill jest poleceniem wbudowanym powłoki.
2️⃣ Jak używać polecenia killall
Podstawowa forma to [killall nazwa procesu]. Znajduje wszystkie działające procesy o podanej nazwie i wysyła do nich sygnał; jeśli podasz kilka nazw, robi to samo dla każdej z nich (według oficjalnego podręcznika).
Ponieważ procesy o tej samej nazwie kończą się wszystkie naraz, najpierw sprawdź poleceniem pgrep, co działa pod tą nazwą. Skopiowaliśmy sleep do folderu roboczego pod nazwami xxsleep-a1, xxsleep-a2 i xxsleep-longname-x1, uruchomiliśmy xxsleep-a1 dwa razy, łącznie cztery procesy, i wypisaliśmy numery oraz nazwy z -l.
pgrep -l xxsleep2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2
2155 xxsleep-longnamW czwartym wierszu plik wykonywalny nazywa się xxsleep-longname-x1, ale nazwa procesu była ucięta na xxsleep-longnam.
Z -a pojawia się cały uruchomiony wiersz polecenia. Dwa procesy xxsleep-a1 o tej samej nazwie rozróżniliśmy po końcowym argumencie w sekundach, 300 i 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 330Aby znaleźć tylko procesy, których nazwa pasuje dokładnie, dodaj -x. Wynik dla xxsleep-a1 to dwa numery.
pgrep -x xxsleep-a12141
2142Aby sprawdzić tylko numery, wpisując jedną nazwę bez zmian, użyj pidof. Wyszukanie xxsleep-a1 pokazało oba numery w jednym wierszu.
pidof xxsleep-a12142 2141ps wypisuje tylko procesy o dokładnie pasującej nazwie, jeśli po -C podasz kilka nazw rozdzielonych przecinkami.
ps -o pid,comm -C xxsleep-a1,xxsleep-a2 PID COMMAND
2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2Na serwerze Debian 12 uruchomiliśmy cztery procesy pod tymi samymi nazwami i wykonaliśmy [killall xxsleep-a1]: nic nie wypisał i zakończył się kodem wyjścia 0. Przy ponownym wyszukaniu przez pgrep oba xxsleep-a1 zniknęły, a zostały tylko xxsleep-a2 i xxsleep-longname-x1. Jeśli zamiast nazwy podasz ścieżkę z ukośnikiem (/), wybiera procesy uruchamiające ten plik niezależnie od nazwy (według oficjalnego podręcznika).
Dla nieistniejącej nazwy xxsleep-zz pojawił się wiersz z [no process found] po nazwie, a polecenie zakończyło się kodem wyjścia 1. Kod wyjścia wynosi 0 tylko wtedy, gdy dla każdej podanej nazwy zakończono co najmniej jeden proces (według oficjalnego podręcznika).
killall xxsleep-zzxxsleep-zz: no process foundAby zakończyć tylko jeden proces o znanym numerze, wyślij sygnał tylko do tego numeru poleceniem kill: Polecenie kill w Linuksie.
3️⃣ Opcje polecenia killall
Po odczytaniu z /proc/PID/comm nazwy procesu uruchomionego jako xxsleep-longname-x1 zostało tylko pierwsze 15 znaków: xxsleep-longnam.
cat /proc/2155/commxxsleep-longnamUruchomiliśmy pgrep z 16-znakową nazwą xxsleep-longname.
pgrep -a xxsleep-longnameZakończył się bez wyjścia z kodem wyjścia 1, a ponowne wyszukanie 15-znakową nazwą xxsleep-longnam pokazało ten proces.
pgrep -l xxsleep-longnam2155 xxsleep-longnamGdy killall dostaje nazwę dłuższą niż 15 znaków, a są procesy, których pełnej nazwy nie może odczytać, celem stają się wszystkie procesy o pasujących pierwszych 15 znakach; z -e pomija takie pozycje (według oficjalnego podręcznika). Gdy na serwerze Debian 12 podaliśmy z -e i -v pierwsze 15 znaków xxsleep-longnam, pojawiły się wiersze o pominięciu trzech innych procesów z nazwą uciętą na 15 znakach, a polecenie zakończyło się na [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 foundPo podaniu pełnej nazwy xxsleep-longname-x1 po tych samych wierszach pominięcia pojawił się wiersz o wysłaniu sygnału do tego procesu.
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 15Z -v dla każdego procesu, do którego wysłano sygnał, pojawił się wiersz z nazwą, numerem i numerem sygnału.
killall -v xxsleep-a2Killed xxsleep-a2(2150) with signal 15-i pyta przy każdym procesie, czy go zakończyć. Ponownie uruchomiliśmy dwa xxsleep-a1 i podaliśmy kolejno y i n przez standardowe wejście: oba pytania pojawiły się jedno po drugim w jednym wierszu, zakończył się tylko pierwszy xxsleep-a1, a drugi pozostał.
printf 'y\nn\n' | killall -i xxsleep-a1Kill xxsleep-a1(2171) ? (y/N) Kill xxsleep-a1(2172) ? (y/N)-u wybiera tylko procesy należące do tego konta, a jeśli pominiesz nazwę, celem są wszystkie procesy tego konta. Gdy po nazwie konta podaliśmy też xxsleep-a1, sygnał trafił tylko do pozostałego xxsleep-a1.
killall -v -u user xxsleep-a1Killed xxsleep-a1(2172) with signal 15-o i -y wybierają według czasu uruchomienia, a czas zapisuje się jako liczbę z jednostką s, m, h, d, w, M lub y, np. [-o 30m].
-r czyta nazwy jako rozszerzone wyrażenia regularne. Po podaniu wzorca ^xxsleep-a do pgrep pojawiły się trzy procesy zaczynające się od xxsleep-a.
pgrep -l '^xxsleep-a'2141 xxsleep-a1
2142 xxsleep-a1
2150 xxsleep-a2-w czeka, sprawdzając co sekundę, aż znikną wszystkie procesy, do których wysłano sygnał. Jeśli proces ignoruje sygnał albo zostaje jako zombie, czekanie może trwać bez końca.
Pierwsza tabela poniżej zawiera polecenia sprawdzające i opcje killall faktycznie uruchomione w tym artykule, a nieuruchomione opcje killall zebrano w drugiej tabeli według oficjalnego podręcznika.
📌 Sprawdzanie procesów i killall: wyniki z tego artykułu
| Polecenie | Zadanie | Wynik w tym artykule | |
|---|---|---|---|
| pgrep -l nazwa | Numer i nazwa procesów, których nazwa ją zawiera | Cztery wiersze dla xxsleep; długa nazwa widoczna tylko do pierwszych 15 znaków, xxsleep-longnam | |
| pgrep -a nazwa | Numer i cały wiersz polecenia | Dwa xxsleep-a1 o tej samej nazwie rozróżnione po końcowych argumentach 300 i 310 | |
| pgrep -x nazwa | Tylko numery procesów o dokładnie pasującej nazwie | Dla xxsleep-a1 dwa wiersze: 2141 i 2142 | |
| pidof nazwa | Numery działające pod tą nazwą, w jednym wierszu | Dla xxsleep-a1 2142 2141 | |
| ps -o pid,comm -C nazwa | Numer i nazwa procesów o dokładnie pasującej nazwie; kilka nazw rozdzielonych przecinkami | Dwa wiersze xxsleep-a1 i jeden wiersz xxsleep-a2 | |
| cat /proc/PID/comm | Nazwa procesu (do pierwszych 15 znaków) | 2155 to xxsleep-longnam | |
| killall nazwa | SIGTERM do procesów o tej nazwie | Oba xxsleep-a1 zakończone, kod wyjścia 0; nieistniejąca nazwa xxsleep-zz dała no process found i kod wyjścia 1 | |
| killall -e nazwa | Nazwy dłuższe niż 15 znaków tylko przy zgodności pełnej nazwy | xxsleep-longnam dał no process found, xxsleep-longname-x1 zakończony | |
| killall -v nazwa | Wypisuje wynik dla każdego procesu, do którego wysłano sygnał | Killed xxsleep-a2(2150) with signal 15 | |
| killall -i nazwa | Pyta o potwierdzenie przy każdym procesie przed zakończeniem | Po wpisaniu y i n zakończył się tylko pierwszy xxsleep-a1 | |
| killall -u nazwa konta | Tylko procesy należące do tego konta | Podane razem z nazwą: zakończył się tylko xxsleep-a1 tego konta | |
| killall -9 nazwa | SIGKILL zamiast SIGTERM | Killed xxsleep-a2(2173) with signal 9 |
📎 Pozostałe opcje: według oficjalnego podręcznika
| Opcja | Zadanie | |
|---|---|---|
| -I, --ignore-case | Porównuje nazwy bez rozróżniania wielkości liter | |
| -g, --process-group | Sygnał do grupy procesów zamiast do procesu (raz na grupę) | |
| -l, --list | Lista znanych nazw sygnałów | |
| -n, --ns PID | Tylko procesy w tej samej przestrzeni nazw PID co ten PID; domyślnie wszystkie przestrzenie nazw | |
| -o, --older-than czas | Tylko procesy uruchomione wcześniej niż ten czas (jednostki s, m, h, d, w, M, y) | |
| -q, --quiet | Nie zgłasza nic, nawet gdy żaden proces nie został zakończony | |
| -r, --regexp | Czyta nazwy jako rozszerzone wyrażenia regularne | |
| -s, --signal sygnał | Sygnał wysyłany zamiast SIGTERM | |
| -V, --version | Wypisuje informacje o wersji | |
| -w, --wait | Czeka, aż znikną wszystkie procesy, do których wysłano sygnał | |
| -y, --younger-than czas | Tylko procesy uruchomione później niż ten czas | |
| -Z, --context wzorzec | Tylko procesy, których kontekst bezpieczeństwa pasuje do wzorca rozszerzonego wyrażenia regularnego; podaje się przed innymi argumentami; nazwę można pominąć |
🔲 Symulator polecenia killall
Symulator poniżej zaczyna od listy czterech procesów xxsleep oraz xxsleep-a2 przykładowego konta user1. Dotknij chipów, aby porównać, które wiersze znikają z listy po [killall -v], [-i] i [-u]; teksty wyjścia killall naśladują wyjście uzyskane na serwerze Debian 12.
4️⃣ Sygnały killall
Sygnał do wysłania podaje się nazwą, np. [-HUP] lub [-SIGHUP], numerem, np. [-1], albo po opcji -s (według oficjalnego podręcznika). [killall -9 nazwa procesu] wysyła sygnał 9, czyli SIGKILL. SIGKILL to sygnał, którego proces nie może przechwycić ani zignorować (według oficjalnego podręcznika), więc proces kończy się bez sprzątania. Dlatego wysyła się go, gdy domyślny sygnał SIGTERM nie kończy procesu.
Gdy na serwerze Debian 12 do ponownie uruchomionego xxsleep-a2 dodaliśmy -9 razem z -v, pojawił się wiersz z numerem sygnału 9.
killall -9 -v xxsleep-a2Killed xxsleep-a2(2173) with signal 9Nazwy i numery sygnałów sprawdziliśmy przez [kill -l]. killall też ma opcję -l, która wypisuje znane mu nazwy sygnałów.
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) SIGRTMAXPo wpisaniu jednego numeru pojawiła się tylko nazwa tego sygnału. Domyślnie wysyłany przez killall sygnał 15 to TERM, a 9 wysyłany z -9 to KILL.
kill -l 15TERMkill -l 9KILLJeśli podasz nazwę sygnału spoza listy, pojawi się komunikat w formie [FOO: unknown signal; killall -l lists signals.] (według oficjalnego podręcznika i tekstów programu).
🔢 FAQ & polecane treści
Podgląd na żywo
Polecenie top w Linuksie (sprawdzanie użycia CPU i pamięci)
Polecenie, które pokazuje na żywo, ile procesora i pamięci używa każdy proces.
Kontrola zadań
Tło (Back Ground) i pierwszy plan (Fore Ground) w Linuksie: sterowanie procesami
Sposób kontroli zadań, który przenosi polecenie do tła i z powrotem na pierwszy plan.
Otwarte pliki
[Linux] Polecenie lsof: wypisywanie informacji o używanych plikach
Polecenie, które pokazuje pliki i gniazda otwarte przez proces wraz z jego PID.
ℹ️ Informacja o linkach partnerskich
Treści tej witryny zawierają linki partnerskie. Jeśli odwiedzający kupi produkt lub usługę przez taki link, witryna otrzymuje od sprzedawcy prowizję. Kwota płacona przy tym przez kupującego (podczas promocji spada↓) nie wzrasta. Podane ceny, rabaty i dostępność odnoszą się do chwili pisania i mogą różnić się od stanu faktycznego, dlatego przed zakupem sprawdź je u sprzedawcy. Produkty wybieramy i oceniamy według własnych kryteriów, a prowizja nie wpływa ani na kolejność prezentacji, ani na treść ocen.