Odpowiedzi:
pgrepOpcje wyjściowe są dość ograniczone. Prawie na pewno będziesz musiał wysłać go z powrotem, psaby uzyskać ważne informacje. Możesz to zautomatyzować za pomocą funkcji bash w swoim ~/.bashrc.
function ppgrep() { pgrep "$@" | xargs --no-run-if-empty ps fp; }
Następnie wywołaj polecenie za pomocą.
ppgrep <pattern>
pspotrzebny jest łącznik do flag:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
-rktóra wykona polecenie tylko wtedy, gdy otrzyma listę.
ps fp $(pgrep -d, "$@")
Połącz pgrepz psużyciem xargs!
pgrep <your pgrep-criteria> | xargs ps <your ps options> -p
Na przykład spróbuj
pgrep -u user | xargs ps -f -p
aby uzyskać pełną listę procesów user.
Miło jest zachować pierwszy wiersz z nazwami kolumn. grepzawsze upuszcza nazwy kolumn.
Poniżej podano tylko PID + pełny wiersz polecenia. Aby uzyskać „wszystkie informacje ps”, zobacz inne odpowiedzi ...
Większość linuksów używa procps-ng . Od wersji 3.3.4 (wydanej w 2012 r.) pgrep -a( --list-full) Pokazuje pełną linię poleceń.
Uwaga: Domyślnie pgrep pasuje tylko do wzorca podanego względem nazwy pliku wykonywalnego. Jeśli chcesz dopasować do pełnej linii poleceń (podobnie jak grepping ps), dodaj opcję -f( --full).
W starszych wersjach (w tym w oryginalnym projekcie procps ) -lopcja wyświetlała informacje, ale jej zachowanie było różne:
pgrep -fl dopasował wzór do pełnej linii poleceń i pokazał pełną linię poleceń.pgrep -lsam pasował tylko do nazwy pliku wykonywalnego i pokazywał tylko nazwę pliku wykonywalnego. Nie jestem pewien, jakiego kodu używa BSD, ale ich strona podręcznika man dokumentuje stare -flzachowanie.
Niestety nie można nawet używać -flprzenośnie - w ostatnim procps-ng -f( --list-name) zawsze drukuje tylko nazwę pliku wykonywalnego.
Dla wersji GNU pgreptym -i(bez uwzględniania wielkości liter) nie jest obsługiwany, a długi + wyjście rozmytej osiąga się -af.
$ pgrep -af apache
OUTPUT:
1748 /usr/sbin/apache2 -k start
-a, --list-full
List the full command line as well as the process ID. (pgrep only.)
-f, --full
The pattern is normally only matched against the process name.
When -f is set, the full command line is used.
W OSX (i przez wnioskowanie, w BSD) -l( długie wyjście ) w połączeniu z -f( dopasuj do pełnych list argumentów ) wyświetli pełne polecenie ( -idodaje rozróżnianie wielkości liter):
$ pgrep -fil ssh
OUTPUT:
33770 ssh: abc@192.168.0.123-22 [mux] t
Strona podręcznika :
-l Long output. For pgrep, print the
process name in addition to the
process ID for each matching
process. If used in conjunction
with -f, print the process ID and
the full argument list for each
matching process. For pkill, dis-
play the kill command used for
each process killed.
Użyj opcji -v, aby grep - zwraca wszystko, ALE żądany wzorzec.
ps -ef | grep <process> | grep -v grep
pgrep -u user | xargs ps -f -p
Nie wydaje mi się, że istnieje, najwięcej informacji, jakie możesz uzyskać, to nazwa i identyfikator procesu, używając opcji -l do pgrep.
ps obsługuje wszelkiego rodzaju opcje formatowania, więc utworzę alias dla tego, co chcesz zapisać. Prostym sposobem na wykluczenie procesu grep z danych wyjściowych jest dołączenie dodatkowego potoku w grep -v grepcelu wykluczenia jakichkolwiek procesów grep.
Aby wyeliminować ten grepproces, możesz użyć nawiasów jako części swojego wzoru:
ps -ef | grep '[t]ty'
Możesz to zrobić za pomocą psi pgrep:
ps -fp $(pgrep -d, tty)
Pomoże ci to chyba:
ps auxww
function ppgrep() { pgrep "$@" | xargs ps fp 2> /dev/null; }W przeciwnym razie, jeśli żaden proces nie odpowiada twojemu wyszukiwaniu, zrzuca całąpsmegillę użycia.