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

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>

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.


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.


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.

1

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

ps -ef | grep <process> | grep -v grep

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.


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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.