Antworten:
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 betrachtetps 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
pgrep php5
nichtNehmen 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
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: P
pgrep
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 geben pgrep
. Die Verwendung ps aux | grep xxx
ist unzuverlässig, daher müssen Hacks grep
aus der Ausgabe herausgefiltert werden, und es kann zu Fehlalarmen kommen, wie bei ps aux | grep root
.
Der ps aux | grep x
Befehl liefert "bessere" Ergebnisse als im pgrep x
Wesentlichen, weil Ihnen bei letzterem eine Option fehlt.
Verwenden Sie einfach die -f
Option 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 | grep
Konstruktion, bei der Sie die grep
Linie herausfiltern oder Mustertricks anwenden müssen, wird sie sich pgrep
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:
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
-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 gilt ps
.
diff <(ps aux|grep x) <(pgrep x) # :)
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/86