Polecenie pgrep: wyszukiwanie PID po nazwie, opcja -f oraz różnice między pidof i pkill
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
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 pgdemo2143
2152
2155Po wpisaniu nazwy aż do pgdemo-a zostały tylko dwa procesy pgdemo-a.
pgrep pgdemo-a2143
2152Szukany 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-zzecho $?1Uruchomienie 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).
pgreppgrep: no matching criteria specified
Try `pgrep --help' for more information.echo $?2Jeś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 -Vpgrep from procps-ng 4.0.22️⃣ Opcja pgrep -f i wynik -l oraz -a
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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -a pgdemo2143 ./pgdemo-a 300
2152 ./pgdemo-a 301
2155 ./pgdemo-b 300Wartoś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-a2141
2143
2150
2152Po 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-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301Gdy 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-a2141 timeout 300 ./pgdemo-a 300
2143 ./pgdemo-a 300
2150 timeout 300 ./pgdemo-a 301
2152 ./pgdemo-a 301
2160 bash chk.sh pgdemo-aWzorzec [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 3013️⃣ Opcje warunków pgrep
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 pgdemopgrep -lx pgdemo-a2143 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 pgdemo2143 pgdemo-a
2152 pgdemo-a
2155 pgdemo-bpgrep -u daemon -l pgdemopgrep -u root,daemon -c pgdemo3Podanie nieistniejącego konta dało błąd [invalid user name] i kod wyjścia 2.
pgrep -u no-such-user9 pgdemopgrep: invalid user name: no-such-user9Także na zwykłym koncie serwera Debian 12 znaleziono tymi samymi opcjami jeden sleep uruchomiony z tego konta.
pgrep -u user1 -l sleep3047 sleeppgrep -u user1 -a sleep3047 sleep 60Gdy 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-a2152pgrep -o pgdemo-a2143Strona 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 pgdemo3pgrep -c pgdemo-zz0Oto zestawienie opcji pgrep.
| Opcja | Kopiuj | Opis |
|---|---|---|
| -f--full | Szukanie w całym wierszu poleceń zamiast w nazwie | |
| -l--list-name | Wypisanie nazwy razem z numerem | |
| -a--list-full | Wypisanie całego wiersza poleceń razem z numerem | |
| -x--exact | Tylko procesy, których cała nazwa się zgadza | |
| -u--euid | Tylko procesy uruchomione przez podane konto; przy kilku kontach rozdzielonych przecinkami którekolwiek z nich | |
| -n--newest | Ostatnio uruchomiony spośród pasujących | |
| -o--oldest | Najwcześniej uruchomiony spośród pasujących | |
| -c--count | Liczba zamiast numerów; kod wyjścia 1, gdy 0 | |
| -d--delimiter | Ustawienie separatora między numerami (domyślnie nowy wiersz) | |
| -V--version | Wypisanie wersji |
| Opcja | Kopiuj | Opis |
|---|---|---|
| -i--ignore-case | Szukanie bez rozróżniania wielkości liter | |
| -v--inverse | Szukanie procesów, które nie pasują | |
| -P--parent | Tylko procesy potomne podanego numeru rodzica (PPID) | |
| -t--terminal | Tylko procesy przypisane do podanego terminala | |
| -g--pgroup | Tylko procesy z podanego numeru grupy procesów | |
| -s--session | Tylko procesy z podanego numeru sesji | |
| -U--uid | Tylko procesy z tym samym rzeczywistym ID użytkownika | |
| -G--group | Tylko procesy z tym samym rzeczywistym ID grupy | |
| -w--lightweight | Wypisanie 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].
4️⃣ Różnice między pgrep, pidof i pkill
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-a2152 2143Dla 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 pgdemopidof -s pgdemo-a2152Aby 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, pgdemo2143,2152,2155ps -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 301Wartoś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.
| Polecenie | Kryterium | Wynik | Zadanie |
|---|---|---|---|
| pgrep | Część nazwy (regex), z -f cały wiersz poleceń | Numery; nazwa i wiersz poleceń z -l, -a | Tylko szuka |
| pidof | Cała nazwa programu | Numery w jednym wierszu | Tylko szuka |
| pkill | Te same warunki co pgrep | Brak | Sygnał do znalezionych procesów (domyślnie SIGTERM) |
🔢 FAQ & polecane treści
Podgląd na żywo
Polecenie top w Linuksie (sprawdzanie użycia CPU i pamięci)
Polecenie, które w czasie rzeczywistym pokazuje, ile procesora i pamięci używa każdy proces.
Otwarte pliki
[Linux] Polecenie lsof: wypisywanie informacji o używanych plikach
Polecenie, które pokazuje pliki otwarte przez proces razem z jego PID.
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.
ℹ️ 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.