Jak uzyskać pgrep, aby wyświetlał pełne informacje o procesie

26

Czy jest jakiś sposób, aby uzyskać pgrepwszystkie informacje na temat każdego procesu ps? Wiem, że potrafię psprzepuszczać, grepale to dużo pisania i daje mi to grepsam proces, którego nie chcę.

JoelFan
źródło

Odpowiedzi:

22

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>
Dan Carley
źródło
2
Dzięki! Zmodyfikowałem go do: 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.
JoelFan,
W systemie OS X pspotrzebny jest łącznik do flag:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
Erik Nomitch
1
Jeśli chcesz uniknąć strony użycia ps, GNU xargs ma opcję, -rktóra wykona polecenie tylko wtedy, gdy otrzyma listę.
Doug
1
Bardziej zwięzły sposób tops fp $(pgrep -d, "$@")
Igor Mikushkin
14

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.

dokładnie
źródło
doskonały! rozwiązuje to dziwny problem ze skryptem uruchamiania serwera arcgis dla xfvb
prusswan
To powinna być zaakceptowana odpowiedź, ponieważ używa rur uniksowych we właściwy sposób, pobierając listę PID z jednego narzędzia i przesyłając je z powrotem do drugiego (jeśli wydaje się to hackowaniem, to nie jest - ta technika może być stosowana w WIELU narzędziach UNIX , jak narzędzia e-mail grep. Funkcja Bash ppgrep () jest niepotrzebną zależnością i pozwala uniknąć konfrontacji z możliwościami uczenia się przedstawionymi tutaj.)
Scott Prive
10

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.
    Jeśli nie chcesz pełnego dopasowania, nie możesz zobaczyć pełnego wiersza poleceń :-( [ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526355#15 ]

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.

Beni Cherniavsky-Paskin
źródło
4

Linux

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

Strona podręcznika :

   -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.

System operacyjny Mac

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.
ccpizza
źródło
1

Użyj opcji -v, aby grep - zwraca wszystko, ALE żądany wzorzec.

ps -ef | grep <process> | grep -v grep
baumgart
źródło
To była dla mnie najlepsza odpowiedź. Pokazuje pełną komendę bez obcinania, jak to się dziejepgrep -u user | xargs ps -f -p
BringBackCommodore64
0

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.

Kyle Brandt
źródło
0

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)
Wstrzymano do odwołania.
źródło
-1

Pomoże ci to chyba:

ps auxww

Blagoy Genadiev
źródło
2
Czy możesz proszę opracować. Więcej informacji poprawiłoby tę odpowiedź
Dave M