Antworten:
ps auxEnthält die vollständige Befehlszeile (Pfad und Parameter), während pgrep nur die ersten 15 Zeichen der Namen der ausführbaren Datei betrachtetps 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.plpgrep php5nichtNehmen 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 pythonnur 11729Folgendes zurückgegeben:wurzel 11729 0.0 0.9 180508 19516? S Jun25 0:00 python / usr / lib / softwareeigenschaften / softwareeigenschaften-dbus
/proc/<pid>/stataber nicht von/proc/<pid>/cmdline . OK, @Thorsen, du hast den Bug Spray gewonnen, es ist ein Bug: P
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.
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
-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 .)
pgrepnett zu spielen, die Lösung. +1
/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.
pgrepals auch gilt ps.
diff <(ps aux|grep x) <(pgrep x) # :)
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