Polecenie pgrep: wyszukiwanie PID po nazwie, opcja -f oraz różnice między pidof i pkill

Środowisko testoweRodzina RHELAlmaLinux 9.8procps-ng 3.3konto rootDebian 12 · procps-ng 4.0.2 zwykłe konto
Polecenia procesów · harmonogramupgrep, pidofLokalizacja/usr/bin/pgrep

Aby znaleźć numer (PID) działającego procesu po nazwie, koncie lub wierszu poleceń, używa się polecenia pgrep. Na serwerze AlmaLinux 9 skopiowano program sleep pod innymi nazwami, uruchomiono trzy procesy i porównano, które procesy znajduje każda opcja. Wyszukiwanie po nazwie zwróciło tylko te trzy procesy, a wyszukiwanie w całym wierszu poleceń z -f zwróciło także timeout, który je uruchomił.

Poniższe wyniki pochodzą z konta root na serwerze AlmaLinux 9.8 i ze zwykłego konta na serwerze Debian 12. Szukane procesy to kopie sleep o nazwach pgdemo-a i pgdemo-b, uruchomione przez timeout 300, aby same zakończyły się po 5 minutach. Numery procesów (PID) i nazwę konta w Debianie (user1) zastąpiono przykładowymi wartościami, a wersję procps-ng na serwerze AlmaLinux podano tylko do wersji głównej i pobocznej.

1️⃣ Podstawowe użycie polecenia pgrep

  • ↪️ Wyszukiwanie PID po nazwie i kod wyjścia

Jeśli po pgrep wpiszesz część nazwy, wypisze ono numery procesów, których nazwa zawiera te znaki, po jednym w wierszu. Wyszukiwanie pgdemo zwróciło trzy numery: dwa pgdemo-a i jeden pgdemo-b.

pgrep pgdemo
2143
2152
2155

Po wpisaniu nazwy aż do pgdemo-a zostały tylko dwa procesy pgdemo-a.

pgrep pgdemo-a
2143
2152

Szukany tekst jest odczytywany jako rozszerzone wyrażenie regularne, a bez opcji pgrep szuka tylko w nazwie procesu.

Jeśli żaden proces nie pasuje, pgrep kończy działanie bez wypisywania czegokolwiek, dlatego wynik sprawdza się po kodzie wyjścia. Po wyszukaniu nieistniejącej nazwy pgdemo-zz polecenie [echo $?] zwróciło 1.

pgrep pgdemo-zz
echo $?
1

Uruchomienie bez żadnego warunku dało poniższy błąd i kod wyjścia 2. Strona man opisuje kody wyjścia jako 0 (znaleziono), 1 (nie znaleziono), 2 (błąd składni wiersza poleceń) i 3 (błąd krytyczny, np. brak pamięci).

pgrep
pgrep: no matching criteria specified
Try `pgrep --help' for more information.
echo $?
2

Jeśli zamiast wyniku użyjesz tego kodu wyjścia jako warunku, skrypt może sprawdzić, czy proces działa. Wersję pokazuje [pgrep -V]. Serwer Debian 12 miał procps-ng 4.0.2, a serwer AlmaLinux 9.8 procps-ng 3.3.

pgrep -V
pgrep from procps-ng 4.0.2

2️⃣ Opcja pgrep -f i wynik -l oraz -a

  • ↪️ Procesy, które pojawiają się przy szukaniu w całym wierszu poleceń

Sam numer nie mówi, który to proces, dlatego z -l wypisuje się także nazwę, a z -a cały wiersz poleceń.

pgrep -l pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -a pgdemo
2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300

Wartości 300 i 301 na końcu wyniku -a to argumenty w sekundach przekazane do sleep. Dzięki tym argumentom rozróżniono dwa procesy pgdemo-a o tej samej nazwie.

Z -f pgrep szuka w całym wierszu poleceń zamiast w nazwie. Wyszukiwanie pgdemo-a z -f zwiększyło liczbę numerów z dwóch do czterech.

pgrep -f pgdemo-a
2141
2143
2150
2152

Po dodaniu -a okazało się, że dwa dodatkowe wiersze to procesy timeout, które otrzymały pgdemo-a jako argument. Ich nazwa to timeout, ale ich wiersz poleceń zawiera pgdemo-a, więc spełniały warunek -f.

pgrep -af pgdemo-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

Gdy używasz -f w skrypcie, sprawdź, czy w wyniku nie pojawia się sam skrypt. pgrep nigdy nie umieszcza w wyniku samego siebie, ale jeśli wiersz poleceń skryptu, który uruchomił pgrep, zawiera szukany tekst, ten skrypt też się pojawi.

Przy wyszukiwaniu pgdemo-a skryptem chk.sh, który przekazuje otrzymany tekst bez zmian do [pgrep -af], w ostatnim wierszu doszedł sam skrypt: bash chk.sh pgdemo-a.

bash chk.sh pgdemo-a
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-a

Wzorzec [p]gdemo-a, w którym pierwsza litera jest w nawiasach kwadratowych, jako wyrażenie regularne znajduje ten sam tekst co pgdemo-a, ale w wierszu poleceń skryptu nawiasy są zapisane dosłownie, więc nie spełnia już warunku. Po przekazaniu tego wzorca do tego samego skryptu wiersz skryptu zniknął i zostały tylko cztery wiersze.

bash chk.sh '[p]gdemo-a'
2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301

3️⃣ Opcje warunków pgrep

  • ↪️ -u konto, -x dokładna nazwa, -n i -o, -c liczba

Z -x pgrep znajduje tylko procesy, których cała nazwa się zgadza, a nie jej część. Dla pgdemo nic nie zwrócono, a dla pgdemo-a zwrócono dwa procesy.

pgrep -x pgdemo
pgrep -lx pgdemo-a
2143 pgdemo-a
2152 pgdemo-a

-u wybiera procesy według konta, które je uruchomiło. Jeśli podasz kilka kont rozdzielonych przecinkami, znajdzie wszystkie procesy należące do któregokolwiek z nich. Trzy procesy uruchomione jako root pojawiły się wszystkie z [-u root], a z [-u daemon] nie pojawił się żaden.

pgrep -u root -l pgdemo
2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-b
pgrep -u daemon -l pgdemo
pgrep -u root,daemon -c pgdemo
3

Podanie nieistniejącego konta dało błąd [invalid user name] i kod wyjścia 2.

pgrep -u no-such-user9 pgdemo
pgrep: invalid user name: no-such-user9

Także na zwykłym koncie serwera Debian 12 znaleziono tymi samymi opcjami jeden sleep uruchomiony z tego konta.

pgrep -u user1 -l sleep
3047 sleep
pgrep -u user1 -a sleep
3047 sleep 60

Gdy kilka procesów ma tę samą nazwę, -n wypisuje tylko ostatnio uruchomiony, a -o tylko najwcześniej uruchomiony. Z dwóch procesów pgdemo-a uruchomionych w odstępie 2 sekund -n wybrało późniejszy, a -o wcześniejszy.

pgrep -n pgdemo-a
2152
pgrep -o pgdemo-a
2143

Strona man podaje, że -n i -o nie mogą być użyte razem. Po podaniu obu pojawił się tylko opis użycia, bez komunikatu o błędzie.

-c wypisuje liczbę procesów zamiast numerów. Gdy nic nie znajdzie, wypisuje 0, a kod wyjścia wynosił 1.

pgrep -c pgdemo
3
pgrep -c pgdemo-zz
0

Oto zestawienie opcji pgrep.

OpcjaKopiujOpis
-f--fullSzukanie w całym wierszu poleceń zamiast w nazwie
-l--list-nameWypisanie nazwy razem z numerem
-a--list-fullWypisanie całego wiersza poleceń razem z numerem
-x--exactTylko procesy, których cała nazwa się zgadza
-u--euidTylko procesy uruchomione przez podane konto; przy kilku kontach rozdzielonych przecinkami którekolwiek z nich
-n--newestOstatnio uruchomiony spośród pasujących
-o--oldestNajwcześniej uruchomiony spośród pasujących
-c--countLiczba zamiast numerów; kod wyjścia 1, gdy 0
-d--delimiterUstawienie separatora między numerami (domyślnie nowy wiersz)
-V--versionWypisanie wersji
OpcjaKopiujOpis
-i--ignore-caseSzukanie bez rozróżniania wielkości liter
-v--inverseSzukanie procesów, które nie pasują
-P--parentTylko procesy potomne podanego numeru rodzica (PPID)
-t--terminalTylko procesy przypisane do podanego terminala
-g--pgroupTylko procesy z podanego numeru grupy procesów
-s--sessionTylko procesy z podanego numeru sesji
-U--uidTylko procesy z tym samym rzeczywistym ID użytkownika
-G--groupTylko procesy z tym samym rzeczywistym ID grupy
-w--lightweightWypisanie wszystkich numerów wątków zamiast numerów procesów

🔲 Symulator polecenia pgrep

Poniższy symulator zaczyna od listy sześciu wierszy pgdemo i timeout z dodanymi przykładowymi procesami. Dotknij chipów, aby porównać na liście po lewej wiersze znalezione przez każdą opcję, i sprawdź przez [pgrep -l pgdemo], jak wynik maleje po [pkill pgdemo-b].

Symulator polecenia pgrepprocps-ng 3.3
[root@server work]#
Działa tylko w przeglądarce. Lista po lewej zawiera przykładowe wartości, a obok wierszy znalezionych przez pgrep pojawia się [Just matched]. [pkill] tylko udaje, usuwając wiersze z listy.

4️⃣ Różnice między pgrep, pidof i pkill

  • ↪️ pidof szuka dokładnej nazwy, pkill wysyła sygnał

pidof bez wyrażeń regularnych znajduje tylko procesy, których cała nazwa programu się zgadza, i wypisuje numery w jednym wierszu, rozdzielone spacjami. Wyszukiwanie pgdemo-a zwróciło oba numery w jednym wierszu, a na początku był 2152, uruchomiony później.

pidof pgdemo-a
2152 2143

Dla części nazwy pgdemo pidof, inaczej niż pgrep, nic nie znalazło, a kod wyjścia wynosił 1. Jeśli potrzebujesz tylko jednego numeru, dodaj -s. [pidof -s pgdemo-a] wypisało tylko 2152.

pidof pgdemo
pidof -s pgdemo-a
2152

Aby zobaczyć czas uruchomienia i numer rodzica (PPID) znalezionych numerów, połącz je przecinkami przez pgrep -d i przekaż do opcji -p, którą ma polecenie ps.

pgrep -d, pgdemo
2143,2152,2155
ps -fp $(pgrep -d, -x pgdemo-a)
UID          PID    PPID  C STIME TTY          TIME CMD
root        2143    2141  0 15:59 ?        00:00:00 ./pgdemo-a 300
root        2152    2150  0 15:59 ?        00:00:00 ./pgdemo-a 301

Wartości 2141 i 2150 w kolumnie PPID to numery procesów timeout, które uruchomiły oba procesy pgdemo-a.

pkill znajduje procesy według tych samych warunków co pgrep, ale zamiast wypisywać numery wysyła do nich sygnał. Bez podanego sygnału wysyła SIGTERM, a sygnał można zmienić, jak w [pkill -HUP nazwa].

pkill wysyła sygnał od razu po znalezieniu procesu, dlatego najpierw sprawdź cele przez [pgrep -a] lub [pgrep -af] z tymi samymi warunkami. Przy -f celem stają się też procesy timeout lub skrypty, których wiersz poleceń zawiera ten sam tekst. Jeśli znasz już numer, wyślij sygnał tylko do niego za pomocą polecenia kill.

PolecenieKryteriumWynikZadanie
pgrepCzęść nazwy (regex), z -f cały wiersz poleceńNumery; nazwa i wiersz poleceń z -l, -aTylko szuka
pidofCała nazwa programuNumery w jednym wierszuTylko szuka
pkillTe same warunki co pgrepBrakSygnał do znalezionych procesów (domyślnie SIGTERM)

🔢 FAQ & polecane treści

pgrep porównuje nazwy procesów tylko do 15 znaków zapisanych w /proc/PID/stat. Jeśli nazwa jest dłuższa niż 15 znaków, szukaj po pierwszych 15 znakach albo użyj -f, aby szukać w całym wierszu poleceń z /proc/PID/cmdline.

Gdy filtrujesz listę ps przez grep, wiersz poleceń tego grep też zawiera szukaną nazwę, więc może pojawić się w wyniku. pgrep nigdy nie umieszcza w wyniku samego siebie i wypisuje tylko numery, które łatwo przekazać innym poleceniom.

Z -v pgrep odwraca warunek i znajduje procesy, które nie pasują. W pkill krótkiej opcji -v nie można użyć, aby zapobiec pomyłkom.

ℹ️ 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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *

Prove your humanity: 3   +   2   =