Warum wird benötigt? Wenn wir und zusammen pgrep
verwenden können , warum benötigen wir dann ? Es wäre seltsam, wenn wir einen Befehl oder hätten .ps
grep
pgrep
lsgrep
curlgrep
Aber ein Unterschied, den ich bemerkte, war, wenn wir zuerst eine tmux-Sitzung starten mit
tmux new -s foo
Dann
ps aux | grep tmux
wird den tmux-Serverprozess nicht finden können, aber
pgrep -l tmux
können. Aber warum haben wir trotzdem kein Flag mit , ps
damit wir grep
wie pgrep
bei den Tmux-Serverprozessen sehen können? Was sind die Unterschiede zwischen ps
mit grep
und pgrep
?
Antwort1
Der ps
Befehl hat zwei Felder, die im Allgemeinen auf diese Weise durchsucht werden, das args
und das comm
. Das erste ist die durch NUL getrennte Programmargumentzeichenfolge. Das zweite ist ein „Name“ für das Programm. Diese werden separat gespeichert und können (auf verschiedenen Betriebssystemen)beidevom Programm selbst zur Laufzeit geändert werden. Programme wie tmux
tun das tatsächlich.
Die Ausgabe von ps
istnicht maschinenlesbarMehrere Felder können enthaltennicht kodierte LeerzeichenDies macht es unmöglich, Feldgrenzen zuverlässig zu bestimmen, da Leerzeichen beliebiger LängeAuchder Feldtrenner. args
und comm
sind tatsächlich zwei solche Felder. Die Ausgabe von ps
ist nur für Menschen lesbar.
Wenn Sie grep
die Ausgabe von ps
daher sind Mustervergleiche ganze Zeilen, ohne zuverlässige Möglichkeit, dieses Muster an das spezifische Feld zu verankern,außerindem Sie so ziemlich alles andere eliminieren, was von Nutzen ist und was Sie möglicherweise von vornherein mit dieser Methode zu finden versuchen.
Zum Beispiel:
- Bei Ihrer
u
Option für Linuxps
(das sich-u
in BSD befindetps
) gibt es einuser
Feld, das Benutzernamen enthält, bei demgrep
Muster, die nach Programmnamen suchen, gelegentlich ebenfalls übereinstimmen. - Das kanonische Problem (beispielhaft dargestellt in „Was ist der Unterschied zwischen ps -ef | grep WDA und ps -ef | grep [W]DA?", "Matching für Programmnamen, warum so viele Treffer?", "Funktion des zweiten grep in `ps | grep -v | grep`", Undvielean anderen Stellen anderswo) ist natürlich, dass das übergebene Muster mit dem des Prozesses selbst
grep
übereinstimmt .grep
args
- Es kann auch vorkommen, dass es mit Umgebungszeichenfolgen übereinstimmt, was besonders wichtig ist, wenn man bedenkt, was häufig in einer
_
Umgebungsvariablen zu finden ist.
%ps -a -x -e -o sid,comm,args | grep dbus-daemon | Kopf -n 4 25 nosh cyclog dbus-daemon/ (nosh) 25 dbus-daemon dbus-daemon --config-file ./system-wide.conf --nofork --address=unix:path=/run/dbus/system_bus_socket 989 dbus-daemon dbus-daemon --config-file ./per-user.conf --nofork --address=unix:path=/run/user/JdeBP/bus 15107 grep grep dbus-daemon % %clearenv --keep-path \ setenv WIBBLE tmux \ ps -a -x -e -o sid, Komm, Befehl | grep tmux 15107 ps PATH=/usr/local/bin:/usr/bin:/bin WIBBLE=tmux ps -a -x -e -o sid,pid,comm,command %
Anders ausgedrückt: grep
dient zum Bearbeiten von Textdateien, die aus Zeilen bestehen. Die Prozesstabelle ist keine Textdatei, und wenn man sie wie eine Textdatei behandelt (durch Übersetzen mit dem ps
Befehl), gehen Informationen über Felder verloren.
Um eine solche Suche durchzuführen, müssen Sie die Prozesstabelle mit etwas anderem als betrachten ps
. Unter Linux können Sie direkt in /proc/${PID}/comm
und den ähnlichen Pseudodateien nach Argumentzeichenfolgen, Umgebungszeichenfolgen usw. suchen.
Oder man kann ein Tool schreiben, das herausfischtdie spezifischen Daten, die abgeglichen werden sollenaus der Prozesstabelle, und das führt die Musterbearbeitung nur für dieses Feld allein aus. Dieses Tool ist nicht für Textdateien, sondern für Prozesstabellen gedacht. Man kann es nennen pgrep
.
Natürlich könnte man auf der Greifhand ein schreiben, ps
dessen Ausgabe mandürfenProzess mit (sagen wir) awk
, weil esIstmaschinenlesbar, kodiert Leerzeichen mit vis()
und bietet somit Felder, die awk
richtig erkennen können. Der Nachteil ist, dass es dann wenigermenschlich-lesbar und nicht ganz das, was ein Konformant ps
sein soll. Ich lasse seine Ausgabe durch, console-flat-table-viewer
um es zu lesen. ☺
%Systemsteuerung ps -p 740 -o sid,comm,args SID-BEFEHL BEFEHL 25 dbus-daemon dbus-daemon\040--Konfigurationsdatei\040./system-wide.conf\040--nofork\040'--Adresse=unix:Pfad=/run/dbus/system_bus_socket' % %Systemsteuerung ps -A -o sid,comm,args,envs,tree | awk '{ wenn ("dbus-daemon"==$2) drucke $3; }' dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon\040--config-file\040./per-user.conf\040--nofork\040'--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon\040--fork\040--print-pid\0405\040--print-address\0407\040--session % %Systemsteuerung ps -A -o sid,comm,args,envs,tree | awk '{ wenn ("dbus-daemon"==$2) drucke $3; }' | unvis dbus-daemon --config-file ./system-wide.conf --nofork '--address=unix:Pfad=/run/dbus/system_bus_socket' dbus-daemon --config-file ./per-user.conf --nofork '--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session %
Weiterführende Literatur
ps
.Allgemeines NetBSD-Befehlshandbuch. 02.12.2016.vis
.Handbuch zu NetBSD-Bibliotheksfunktionen. 22.04.2017.- Schlomi Noach (01.10.2009). So testen Sie NICHT, ob mysqld aktiv ist. code.openark.org.
- Greg Wooledge. „Das Risiko beim Parsen des Prozessbaums“.Prozessmanagement. Gregs Wiki.
- Jonathan de Boyne Pollard (2015).
clearenv
.nosh-Anleitung. Software. - Jonathan de Boyne Pollard (2015).
setenv
.nosh-Anleitung. Software. - Jonathan de Boyne Pollard (2020).
ps
.nosh-Anleitung. Software. - Jonathan de Boyne Pollard (2020).
list-process-table
.nosh-Anleitung. Software.