Warum macht “ps aux | grep x gibt bessere Ergebnisse als "pgrep x"?

82

Ich habe gerade den folgenden Befehl auf meinem Ubuntu ausprobiert, es zeigt nichts an:

pgrep php5

Sollte es nicht die Prozess-ID von PHP5 zurückgeben (was der folgende Befehl gerade tut) ?:

ps aux | grep php5

Was ist der Unterschied zwischen diesen beiden Befehlen?

xczzhh
quelle

Antworten:

75

ps auxEnthält die vollständige Befehlszeile (Pfad und Parameter), während pgrep nur die ersten 15 Zeichen der Namen der ausführbaren Datei betrachtet

ps auxGibt die vollständige Befehlszeile jedes Prozesses zurück, während pgrepnur die Namen der ausführbaren Dateien angezeigt werden.

Dies bedeutet, dass die Grepping-ps aux Ausgabe mit allem übereinstimmt, was im Pfad oder in den Parametern eines Prozesses "binary: eg" vorkommt

  • ps aux | grep php5 wird passen /usr/share/php5/i-am-a-perl-script.pl
  • aber pgrep php5nicht

Nehmen Sie ein Beispiel aus meinem System - nur verwenden wir Python anstelle von php5:

  • ps aux | grep python gibt uns:
izx 2348 0,0 0,7 514928 15644? Sl Jun24 0:00 / usr / bin / python / usr / lib / unity-lens-video / unity-lens-video
izx 2444 0,0 0,9 547392 18864? Sl Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote
wurzel 2805 0.0 0.5 95436 12204? S Jun24 0:00 / usr / bin / python / usr / lib / systemservice / systemservice -d
izx 6272 0.0 2.9 664400 60320? SNl Jun24 1:16 / usr / bin / python / usr / bin / update-manager - kein Fokus auf der Karte
wurzel 11729 0.0 0.9 180508 19516? S Jun25 0:00 python / usr / lib / softwareeigenschaften / softwareeigenschaften-dbus
  • Es wird jedoch pgrep pythonnur 11729Folgendes zurückgegeben:
wurzel 11729 0.0 0.9 180508 19516? S Jun25 0:00 python / usr / lib / softwareeigenschaften / softwareeigenschaften-dbus
ish
quelle
3
"pgrep -l" verkürzt den Vorgang ebenfalls auf 15 Zeichen, was wahrscheinlich ein Fehler ist, aber schon seit Ewigkeiten so ist
Thorsen
1
Nun, es ist im Launchpad als Upstream-Bug ab 2008 :) "top und ps-Befehl nach 15 Zeichen abschneiden
Thorsen
2
Hah, das erklärt es aus Kommentar 3: Dies liegt an der Tatsache, dass einige Prozeduren von procs den Befehlsnamen von bekommen, /proc/<pid>/stataber nicht von/proc/<pid>/cmdline . OK, @Thorsen, du hast den Bug Spray gewonnen, es ist ein Bug: P
ish
2
@xczzhh pgrepist kein unvernünftiger Befehl. Es funktioniert gut und wie geplant. Das Problem ist einfach, dass Sie eine Option verpasst haben, wenn Sie sie ausführen. Sie können dafür keine Schuld geben pgrep. Die Verwendung ps aux | grep xxxist unzuverlässig, daher müssen Hacks grepaus der Ausgabe herausgefiltert werden, und es kann zu Fehlalarmen kommen, wie bei ps aux | grep root.
Juli
1
Dies sollte in einem Anti-Drogen-Werbespot sein, die Schöpfer von Bash-Tools waren so begeistert von LSD, dass sie dachten, solche Dinge seien gut designt
Andy Ray
78

Der ps aux | grep xBefehl liefert "bessere" Ergebnisse als im pgrep xWesentlichen, weil Ihnen bei letzterem eine Option fehlt.

Verwenden Sie einfach die -fOption für pgrep, um die gesamte Befehlszeile zu durchsuchen und nicht nur den Prozessnamen, der das Standardverhalten darstellt, z.

pgrep -f php5

Anders als bei der ps | grepKonstruktion, bei der Sie die grepLinie herausfiltern oder Mustertricks anwenden müssen, wird sie sich pgrepeinfach nicht von selbst auswählen.

Sollte Ihr Muster in einer ps USERSpalte erscheinen , erhalten Sie unerwünschte Prozesse in der Ausgabe, pgrepdie nicht unter diesem Fehler leiden.

Wenn Sie vollständige Details anstatt nur der Pids möchten, können Sie Folgendes verwenden:

ps wup $(pgrep -f python)

Das ist einfacher und zuverlässiger als

ps aux | grep python | grep -v grep

oder

ps aux | grep p[y]thon
jlliagre
quelle
3
Fügen Sie außerdem die Option -a( --list-full) hinzu, wenn Sie die vollständige Befehlszeile und nicht nur die PID anzeigen möchten. (Ältere pgrep hatte keine -a, tat dies auf-fl .)
Beni Cherniavsky-Paskin
1
Die ursprüngliche Frage bezog sich auf den Unterschied, aber dies gibt denjenigen von uns, die versuchen, pgrepnett zu spielen, die Lösung. +1
2rs2ts
@ 2rs2ts Danke, mir fehlte in der Tat die Antwort auf die gestellte Frage. Jetzt behoben.
Juli
In einigen Fällen, wenn sich Programme so ändern /proc/self/cmdline, dass sie "beschreibend" sind, pgrep -fa rubystimmen sie nicht überein, z. puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker], während der "dümmer" pgrep -a rubywird. Ich bin nicht sicher, ob letztere auch getäuscht werden können.
Beni Cherniavsky-Paskin
@ BeniCherniavsky-Paskin Ich denke, das hätte ein Kommentar zu der Frage sein können, da es sowohl für pgrepals auch gilt ps.
Franklin Yu
3
diff <(ps aux|grep x) <(pgrep x) # :)
Thorsen
quelle
12
Dies mag die Antwort auf die Frage beantworten - aber vielleicht können Sie Ihre Antwort erweitern, um zu erklären, was dieser einzeilige Befehl bewirkt.
fossfreedom
1

Derzeit liefert pgrep pseine vollständigere Ausgabe als, pgep -fda pgrep auf die ersten 4.096 Zeichen beschränkt ist (betrifft häufig Java-Benutzer, die nach der Eintragsklasse eines Java-Programms mit einem langen Klassenpfad suchen). Der Bug Tracking lautet: https://gitlab.com/procps-ng/procps/issues/86

Ton B.
quelle
Sah für immer danach aus.
Dienstag,