ps aux
zawiera pełną linię poleceń (ścieżkę i parametry), podczas gdy pgrep sprawdza tylko pierwsze 15 znaków nazw plików wykonywalnych
ps aux
zwraca pełny wiersz poleceń każdego procesu, podczas gdy pgrep
patrzy tylko na nazwy plików wykonywalnych.
Oznacza to, że dane wyjściowe grepowania ps aux
będą pasować do wszystkiego, co pojawi się na ścieżce lub parametrów binarnych procesu: np
ps aux | grep php5
będzie pasować /usr/share/php5/i-am-a-perl-script.pl
- ale
pgrep php5
nie zrobi tego
Weź przykład z mojego systemu - tylko użyjemy Pythona zamiast php5
:
ps aux | grep python
daje nam:
izx 2348 0,0 0,7 514928 15644? Sl Jun24 0:00 / usr / bin / python / usr / lib / unity-lens-video / unity-lens-video
izx 2444 0,0 0,9 547392 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote
korzeń 2805 0,0 0,5 95436 12204? S Jun24 0:00 / usr / bin / python / usr / lib / system-service / system-service-d
izx 6272 0,0 2,9 664400 60320? SNl Jun24 1:16 / usr / bin / python / usr / bin / update-manager - no-focus-on-map
korzeń 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
- Ale
pgrep python
zwraca tylko 11729
, co zobaczysz z powyższej listy:
korzeń 11729 0,0 0,9 180508 19516? S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
/proc/<pid>/stat
ale nie od/proc/<pid>/cmdline
. OK, @Thorsen, wygrywasz spray na robaki, to błąd: Ppgrep
nie jest nierozsądnym poleceniem. Działa dobrze i zgodnie z przeznaczeniem. Problem polega na tym, że po prostu brakowało Ci opcji podczas uruchamiania, nie możesz za to winićpgrep
. Korzystanieps aux | grep xxx
jest zawodna, więc trzeba hacki odfiltrowaćgrep
się od wyjścia i może dawać fałszywie dodatnie jak zps aux | grep root
.ps aux | grep x
Komenda daje „lepsze” wyniki niżpgrep x
w istocie, ponieważ brakuje opcję z nim.Po prostu użyj
-f
opcjipgrep
do przeszukania pełnego wiersza poleceń, a nie tylko nazwy procesu, która jest jego domyślnym zachowaniem, np .:W przeciwieństwie do
ps | grep
konstrukcji, w której musisz odfiltrowaćgrep
linię lub użyć sztuczek z wzorami,pgrep
po prostu nie wybierze się z założenia.Ponadto, jeśli twój wzór pojawi się w
ps
USER
kolumnie, otrzymasz niechciane procesy na wyjściu,pgrep
nie cierpi z powodu tej wady.Jeśli chcesz uzyskać pełne informacje zamiast samych pid, możesz użyć:
co jest prostsze i bardziej niezawodne niż
lub
źródło
-a
(--list-full
), jeśli chcesz zobaczyć pełny wiersz poleceń, a nie tylko pid. (Starszy pgrep nie miał-a
, zrobił to dalej-fl
.)pgrep
dobrze grać. +1/proc/self/cmdline
na „opisowe”,pgrep -fa ruby
nie będą pasować np.puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
, podczas gdy „głupszy”pgrep -a ruby
będzie. Nie jestem pewien, czy ten drugi też może zostać oszukany.pgrep
ips
.źródło
W tej chwili
ps
da bardziej kompletny wynik niżpgep -f
jako, że pgrep jest ograniczony do pierwszych 4096 znaków (często wpływających na użytkowników Java szukających klasy wejściowej programu Java z długą ścieżką klas). Błąd śledzenia to: https://gitlab.com/procps-ng/procps/issues/86źródło