Weiterführende Literatur

Weiterführende Literatur

Warum wird benötigt? Wenn wir und zusammen pgrepverwenden können , warum benötigen wir dann ? Es wäre seltsam, wenn wir einen Befehl oder hätten .psgreppgreplsgrepcurlgrep

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 , psdamit wir grepwie pgrepbei den Tmux-Serverprozessen sehen können? Was sind die Unterschiede zwischen psmit grepund pgrep?

Antwort1

Der psBefehl hat zwei Felder, die im Allgemeinen auf diese Weise durchsucht werden, das argsund 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 tmuxtun das tatsächlich.

Die Ausgabe von psistnicht maschinenlesbarMehrere Felder können enthaltennicht kodierte LeerzeichenDies macht es unmöglich, Feldgrenzen zuverlässig zu bestimmen, da Leerzeichen beliebiger LängeAuchder Feldtrenner. argsund commsind tatsächlich zwei solche Felder. Die Ausgabe von psist nur für Menschen lesbar.

Wenn Sie grepdie Ausgabe von psdaher 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:

%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: grepdient 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 psBefehl), 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}/commund 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, psdessen Ausgabe mandürfenProzess mit (sagen wir) awk, weil esIstmaschinenlesbar, kodiert Leerzeichen mit vis()und bietet somit Felder, die awkrichtig erkennen können. Der Nachteil ist, dass es dann wenigermenschlich-lesbar und nicht ganz das, was ein Konformant pssein soll. Ich lasse seine Ausgabe durch, console-flat-table-viewerum 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

verwandte Informationen