Przejdź do głównej zawartości

pkill


  • pkill – narzędzie do wysyłania sygnałów do procesów wybranych na podstawie nazwy, pełnej komendy (-f) lub innych atrybutów (UID, TTY, PPID itd.).
  • Typowe zastosowania: grzeczne przeładowanie demonów (-HUP), zakończenie wybranych procesów (-TERM, -KILL), zatrzymanie/wznowienie (-STOP, -CONT), automatyzacja w skryptach.
  • Składowa pakietu procps / procps‑ng w większości dystrybucji Linux. Odpowiedniki istnieją w BSD i Solaris (drobne różnice w opcjach).

Okno terminala
pkill [opcje] <wzorzec>
pkill -SIGNAL [opcje] <wzorzec>
pkill --signal SIGUSR1 [opcje] <wzorzec>
  • <wzorzec> to wyrażenie regularne ERE dopasowywane domyślnie do nazwy procesu; użyj -f, aby dopasowywać pełną linię poleceń.
  • Domyślny sygnał to SIGTERM (łagodne zakończenie).
  • Warianty: jednorazowo w terminalu lub w skryptach (cron, systemy CI/CD).

ParametrOpis
-SIGNAL, `—signal <nazwanumer>`Sygnał do wysłania (np. -HUP, -TERM, -KILL, --signal SIGUSR1).
-e, --echoWypisz PID i nazwę każdego procesu, do którego wysłano sygnał (potwierdzenie).
-f, --fullDopasowanie do pełnej komendy (cmdline), nie tylko nazwy.
-x, --exactŚcisłe dopasowanie całej nazwy/komendy.
-i, --ignore-caseDopasowanie bez rozróżniania wielkości liter.
-n / -oTylko najmłodszy / najstarszy z dopasowanych procesów.
-O <sek>Wybiera procesy starsze niż podany czas (sekundy).
-u <euid[,..]>, -U <ruid[,..]>Filtrowanie po efektywnym / rzeczywistym UID użytkownika.
-P <ppid[,..]>Filtrowanie po PID rodzica (PPID).
-g <pgid[,..]>Filtrowanie po ID grupy procesów.
-s <sid[,..]>Filtrowanie po ID sesji.
-t <tty[,..]>Filtrowanie po TTY (np. pts/0, tty1).
-F <plik>, --pidfile <plik>Pobierz PID‑y z pidfile (przydatne dla demonów).
-L, --logpidfileZgłoś błąd, jeśli pidfile nie jest zablokowany.
--ns <pid> / --nslist <ipc,mnt,...>Dopasuj tylko procesy w tych samych przestrzeniach nazw; zwykle wymaga roota.
-q, --queue <wartość>Użyj sigqueue(3) i wyślij wraz z sygnałem liczbę całkowitą.
-V, --version / -h, --helpWersja / pomoc.

Uwaga: Flagi listujące procesy -l/-a oraz separator -d dotyczą pgrep, nie pkill. Opcja -v (negacja) w pkill jest wyłączona, by uniknąć przypadkowego „zabicia wszystkiego”.


Okno terminala
# 1) Grzeczne przeładowanie konfiguracji Nginx (HUP)
pkill -HUP nginx
# Efekt: procesy nginx otrzymują HUP i wczytują konfigurację bez zatrzymania usługi.
Okno terminala
# 2) Zakończ dokładnie proces o nazwie 'sshd' i pokaż, co ubito
pkill -e -x sshd
# Efekt: wysyła SIGTERM do wszystkich procesów o nazwie dokładnie 'sshd' i wypisuje PID/nazwę.
Okno terminala
# 3) Wyślij sygnał tylko do procesów użytkownika www-data
pkill -u www-data -TERM -x nginx
# Efekt: zakończy tylko procesy nginx należące do www-data (bez innych użytkowników).
Okno terminala
# 4) Zatrzymaj (SIGSTOP) potomne 'sleep' bieżącego skryptu
pkill --signal SIGSTOP -P "$PPID" -x sleep
# Efekt: pauzuje wszystkie potomne 'sleep'; wznowisz `pkill --signal SIGCONT -P "$PPID" -x sleep`.
Okno terminala
# 5) Użyj pełnej komendy, zabij **tylko najnowszy** proces pasujący do wzorca regex
pkill -n -f 'python3 .*app.py'
# Efekt: sygnał (domyślnie TERM) trafi tylko w najświeższy pasujący proces.
Okno terminala
# 6) Z pidfile – bez wzorca
pkill -F /run/myapp.pid
# Efekt: wysyła sygnał do PID z pliku; wygodne dla demonów piszących pidfile.
Okno terminala
# 7) Kill w tej samej przestrzeni nazw co proces 1234 (np. kontener)
sudo pkill --ns 1234 -f myservice
# Efekt: dopasowanie i sygnał ograniczone do namespace'ów procesu 1234.

  • Domyślny sygnał = SIGTERM. Najpierw używaj łagodnych sygnałów (TERM, HUP), a po braku efektu – dopiero -KILL.
  • Precyzja ma znaczenie: Używaj -x, -f, filtrów -u/-U, a w razie wątpliwości przetestuj wzorzec w pgrep zanim użyjesz pkill.
  • Cytowanie i regex: pkill używa regexów ERE. Cytuj wzorce '...', kotwicz ^...$, by unikać zbyt szerokich trafień.
  • Uprawnienia: Do sygnalizowania cudzych procesów potrzebne są uprawnienia roota (lub odpowiednie capabilities).
  • Różnice systemowe: Opcje różnią się między Linux (procps‑ng), BSD i BusyBox. Na usługach zarządzanych przez systemd preferuj systemctl stop/restart zamiast „ręcznego” ubijania.
  • Ograniczenia dopasowania nazwy: Nazwa z /proc/PID/stat bywa skracana (≈15 znaków) – używaj -f, aby dopasować pełną komendę.
  • Łączenie opcji: -n, -o i -v nie mogą być łączone razem (w pkill skrót -v i tak jest wyłączony).

Błąd / KomunikatPrzyczynaRozwiązanie
Brak efektu / kod wyjścia 1Brak dopasowań lub nie udało się wysłać sygnałuSprawdź wzorzec w pgrep, dodaj -f/-x, zwiększ uprawnienia (sudo).
pkill: invalid signal nameLiterówka lub niepoprawny sygnałUżyj kill -l (lista sygnałów) lub podaj numer, np. -9.
Operation not permittedBrak praw do sygnalizowania procesu innego użytkownikaUruchom jako root/sudo, sprawdź SELinux/AppArmor.
invalid user name (przy -u/-U)Nieistniejący użytkownik/UIDZweryfikuj getent passwd <user> lub użyj numeru UID.
„Zabiłem za dużo!” (zbyt szeroki wzorzec)Regex dopasował niechciane procesyZawsze testuj pgrep, dodaj -x, filtry -u/-t, zakotwicz wzorzec.
cannot lock pidfile (-L)Plik PID nie jest zablokowany – możliwa konkurencjaSprawdź, czy demon działa, użyj właściwego pidfile/ścieżki.
The options -n and -o and -v can not be combinedNiedozwolone łączenie opcjiUsuń konfliktujące opcje; w pkill nie używaj -v.