ps aux
Enthält die vollständige Befehlszeile (Pfad und Parameter), während pgrep nur die ersten 15 Zeichen der Namen der ausführbaren Datei betrachtet
ps aux
Gibt die vollständige Befehlszeile jedes Prozesses zurück, während pgrep
nur 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 php5
nicht
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 python
nur 11729
Folgendes zurückgegeben:
wurzel 11729 0.0 0.9 180508 19516? S Jun25 0:00 python / usr / lib / softwareeigenschaften / softwareeigenschaften-dbus
/proc/<pid>/stat
aber nicht von/proc/<pid>/cmdline
. OK, @Thorsen, du hast den Bug Spray gewonnen, es ist ein Bug: Ppgrep
ist 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 gebenpgrep
. Die Verwendungps aux | grep xxx
ist unzuverlässig, daher müssen Hacksgrep
aus der Ausgabe herausgefiltert werden, und es kann zu Fehlalarmen kommen, wie beips aux | grep root
.Der
ps aux | grep x
Befehl liefert "bessere" Ergebnisse als impgrep x
Wesentlichen, weil Ihnen bei letzterem eine Option fehlt.Verwenden Sie einfach die
-f
Option fürpgrep
, um die gesamte Befehlszeile zu durchsuchen und nicht nur den Prozessnamen, der das Standardverhalten darstellt, z.Anders als bei der
ps | grep
Konstruktion, bei der Sie diegrep
Linie herausfiltern oder Mustertricks anwenden müssen, wird sie sichpgrep
einfach nicht von selbst auswählen.Sollte Ihr Muster in einer
ps
USER
Spalte erscheinen , erhalten Sie unerwünschte Prozesse in der Ausgabe,pgrep
die nicht unter diesem Fehler leiden.Wenn Sie vollständige Details anstatt nur der Pids möchten, können Sie Folgendes verwenden:
Das ist einfacher und zuverlässiger als
oder
quelle
-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
.)pgrep
nett zu spielen, die Lösung. +1/proc/self/cmdline
, dass sie "beschreibend" sind,pgrep -fa ruby
stimmen sie nicht überein, z.puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
, während der "dümmer"pgrep -a ruby
wird. Ich bin nicht sicher, ob letztere auch getäuscht werden können.pgrep
als auch giltps
.quelle
Derzeit liefert pgrep
ps
eine vollständigere Ausgabe als,pgep -f
da 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/86quelle