Odpowiedzi:
pgrep
Opcje wyjściowe są dość ograniczone. Prawie na pewno będziesz musiał wysłać go z powrotem, ps
aby 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>
ps
potrzebny jest łącznik do flag:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
-r
która wykona polecenie tylko wtedy, gdy otrzyma listę.
ps fp $(pgrep -d, "$@")
Połącz pgrep
z ps
uż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. grep
zawsze 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 ) -l
opcja 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 -l
sam 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 -fl
zachowanie.
Niestety nie można nawet używać -fl
przenośnie - w ostatnim procps-ng -f
( --list-name
) zawsze drukuje tylko nazwę pliku wykonywalnego.
Dla wersji GNU pgrep
tym -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 ( -i
dodaje 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 grep
celu wykluczenia jakichkolwiek procesów grep.
Aby wyeliminować ten grep
proces, możesz użyć nawiasów jako części swojego wzoru:
ps -ef | grep '[t]ty'
Możesz to zrobić za pomocą ps
i 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łąps
megillę użycia.