So erhalten Sie pgrep, um die vollständigen Prozessinformationen anzuzeigen

25

Gibt es eine Möglichkeit pgrep, mir alle Informationen zu jedem Vorgang zu geben, der ausgeführt pswird? Ich weiß , ich kann Rohr psdurch , grepaber das ist eine Menge Tipparbeit und es gibt mir auch die grepVerfahren selbst , das will ich nicht.

JoelFan
quelle

Antworten:

22

pgrepDie Ausgabeoptionen von sind ziemlich begrenzt. Sie müssen es mit ziemlicher Sicherheit zurückschicken ps, um die wichtigen Informationen zu erhalten. Sie können dies automatisieren, indem Sie eine Bash - Funktion in Ihrem System verwenden ~/.bashrc.

function ppgrep() { pgrep "$@" | xargs --no-run-if-empty ps fp; }

Rufen Sie dann den Befehl mit auf.

ppgrep <pattern>
Dan Carley
quelle
2
Vielen Dank! Ich habe es folgendermaßen geändert: function ppgrep() { pgrep "$@" | xargs ps fp 2> /dev/null; } Wenn keine Prozesse mit Ihrer Suche übereinstimmen, wird eine ganze psMegilla ausgegeben.
JoelFan
Unter OS X wird psein Bindestrich für die Flags benötigt:function ppgrep() { pgrep "$@" | xargs ps -fp 2> /dev/null; }
Erik Nomitch
1
Wenn Sie die ps-Verwendungsseite vermeiden möchten, hat GNU xargs eine Option, -rdie den Befehl nur dann ausführt, wenn sie eine Liste erhalten hat.
Doug
1
Noch prägnanter istps fp $(pgrep -d, "$@")
Igor Mikushkin
13

Kombinieren Sie pgrepmit psmit xargs!

pgrep <your pgrep-criteria> | xargs ps <your ps options> -p

Zum Beispiel versuchen

pgrep -u user | xargs ps -f -p

um eine vollständige Prozessliste von zu erhalten user.

Schön, dass Sie die erste Zeile mit den Spaltennamen behalten. greplöscht immer die Spaltennamen.

einfach
quelle
Ausgezeichnet! dies behebt ein seltsames problem mit dem arcgis server start script für xfvb
prusswan
Dies sollte die akzeptierte Antwort sein, da Unix-Pipes ordnungsgemäß verwendet werden, eine Liste von PIDs von einem Tool abgerufen und in ein anderes zurückgespeist wird (wenn es wie Hackery aussieht, ist dies nicht der Fall - diese Technik kann in vielen UNIX-Tools verwendet werden Die Bash-Funktion ppgrep () ist eine unnötige Abhängigkeit und vermeidet es, sich der hier vorgestellten Lernmöglichkeit zu stellen.)
Scott Prive
10

Im Folgenden wird nur die vollständige PID + -Befehlszeile angezeigt. Für "all the info psdoes", siehe andere Antworten ...

Die meisten Linux- Betriebssysteme verwenden procps-ng . Seit 3.3.4 (veröffentlicht im Jahr 2012) zeigt pgrep -a( --list-full) die vollständige Befehlszeile.
Hinweis: Standardmäßig vergleicht pgrep nur das von Ihnen angegebene Muster mit dem Namen der ausführbaren Datei. Wenn Sie eine Übereinstimmung mit der vollständigen Befehlszeile erzielen möchten (wie bei grepping ps), fügen Sie die Option -f( --full) hinzu.

In älteren Versionen (einschließlich des ursprünglichen procps- Projekts) -lzeigte die Option Informationen an, aber das Verhalten war unterschiedlich:

  • pgrep -fl Das Muster wurde mit der vollständigen Befehlszeile abgeglichen und die vollständige Befehlszeile angezeigt.
  • pgrep -lAlleine stimmt nur mit dem Namen der ausführbaren Datei überein und zeigt nur den Namen der ausführbaren Datei an.
    Wenn Sie keine vollständige Übereinstimmung wünschen, wird die vollständige Befehlszeile nicht angezeigt :-( [ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526355#15 ]

Ich bin nicht sicher, welchen Code * BSD verwendet, aber die Manpage dokumentiert das alte -flVerhalten.

Leider können Sie es nicht einmal -flportabel verwenden - in neueren procps-ng gibt -f( --list-name) immer nur den Namen der ausführbaren Datei aus.

Beni Cherniavsky-Paskin
quelle
4

Linux

Für die GNU-Version wird pgrepder -i(case-insensitivity) nicht unterstützt, und Long + Fuzzy-Ausgabe wird mit erreicht -af.

$ pgrep -af apache

OUTPUT:
    1748 /usr/sbin/apache2 -k start

Manpage :

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

Mac OS

Unter OSX (und folglich unter BSD) -l( lange Ausgabe ) wird in Kombination mit -f( Übereinstimmung mit vollständigen Argumentlisten ) der vollständige Befehl angezeigt ( -iGroß- / Kleinschreibung wird nicht berücksichtigt):

$ pgrep -fil ssh

OUTPUT:
    33770 ssh: abc@192.168.0.123-22 [mux] t

Die Manpage :

 -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
quelle
1

Verwenden Sie die Option -v für grep - sie gibt alles zurück, ABER das angeforderte Muster.

ps -ef | grep <process> | grep -v grep
baumgart
quelle
Dies war die beste Antwort für mich. Es zeigt Ihnen den vollständigen Befehl, ohne dabei abgeschnitten zu werdenpgrep -u user | xargs ps -f -p
BringBackCommodore64
0

Ich glaube nicht, dass dies der Fall ist. Die meisten Informationen, die Sie erhalten können, sind der Name und die Prozess-ID, wenn Sie die Option -l für pgrep verwenden.

ps unterstützt alle Arten von Formatierungsoptionen, daher würde ich nur einen Alias ​​für das erstellen, was Sie für die Eingabe speichern möchten. Eine einfache Möglichkeit, den grep-Prozess von der Ausgabe auszuschließen, besteht darin, eine zusätzliche Pipe grep -v grepeinzuschließen, um alle grep-Prozesse auszuschließen.

Kyle Brandt
quelle
0

Um den grepProzess zu eliminieren , können Sie Klammern als Teil Ihres Musters verwenden:

ps -ef | grep '[t]ty'

Sie können dies mit psund tun pgrep:

ps -fp $(pgrep -d, tty)
Bis auf weiteres angehalten.
quelle
-1

Dies wird Ihnen helfen, denke ich:

ps auxww

Blagoy Genadiev
quelle
2
Können Sie das bitte näher erläutern? Weitere Informationen würden diese Antwort verbessern
Dave M