Odpowiedzi:
ps aux
zawiera pełną linię poleceń (ścieżkę i parametry), podczas gdy pgrep sprawdza tylko pierwsze 15 znaków nazw plików wykonywalnychps 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
pgrep php5
nie zrobi tegoWeź 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
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: P
pgrep
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
. Korzystanie ps aux | grep xxx
jest zawodna, więc trzeba hacki odfiltrować grep
się od wyjścia i może dawać fałszywie dodatnie jak z ps 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
opcji pgrep
do przeszukania pełnego wiersza poleceń, a nie tylko nazwy procesu, która jest jego domyślnym zachowaniem, np .:
pgrep -f php5
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ć:
ps wup $(pgrep -f python)
co jest prostsze i bardziej niezawodne niż
ps aux | grep python | grep -v grep
lub
ps aux | grep p[y]thon
-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
i ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
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