Drucken Sie Pids und Namen von Prozessen, während sie erstellt werden

10

Ausgehend von der hier gestellten Frage möchte das OP wiederholt die PID eines Prozesses abfragen, der pidofin einem Shell-Skript verwendet wird. Dies ist natürlich ineffizient, da ein neuer Prozess für das pidofProgramm mehrmals pro Sekunde gestartet werden muss (ich weiß nicht, dass dies die Ursache für die CPU-Spitzen in der Frage ist, aber es scheint wahrscheinlich).

Normalerweise besteht die Umgehung dieser Art in einem Shell-Skript darin, mit einem einzelnen Programm zu arbeiten, das die benötigten Daten ausgibt, stdoutund bei Bedarf eine Textverarbeitung durchzuführen. Dies bedeutet, dass mehr Programme gleichzeitig ausgeführt werden müssen, es ist jedoch wahrscheinlich weniger CPU-intensiv, da nicht ständig neue Prozesse für Abrufzwecke erstellt werden.

Für die obige Frage könnte eine Lösung darin bestehen, ein Programm zu haben, das die Namen und Pids von Prozessen ausgibt, wenn sie erstellt werden. Dann könnten Sie etwas tun wie:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

Das Problem dabei ist, dass es eine grundlegendere Frage aufwirft, wie Pids und Prozessnamen gedruckt werden können, wenn sie erstellt werden.

Ich habe ein Programm namens gefunden ps-watcher, obwohl das Problem dabei ist, dass es nur ein perlSkript ist, das wiederholt ausgeführt wird, psso dass es das Problem nicht wirklich löst. Eine andere Option ist die Verwendung, auditddie wahrscheinlich funktionieren könnte, wenn das Protokoll direkt über verarbeitet würde tail -f. Eine ideale Lösung wäre einfacher und tragbarer als diese, obwohl ich eine auditdLösung akzeptieren werde, wenn dies die beste Option ist.

Graeme
quelle
1
Eine interessante Randnotiz ist, dass die PID zuerst als Kopie des Erstellungsprozesses ( forkoder der Variante) erstellt wird und dann das neue Programm mit einem execFamilienmitglied gestartet wird . Sie möchten also wahrscheinlich das protokollieren exec*, nicht das fork.
Derobert
2
Die einzige tragbare effiziente Art und Weise mir bewusst bin , ist gewöhnliches Unix Prozess - Accounting zu verwenden, die einen Datensatz schreiben werden nach einem Prozess beendet wird . Wenn Sie Prozesse abfangen möchten, während sie erstellt oder ausgeführt werden, benötigen Sie wahrscheinlich systemspezifische Dinge wie Linux auditd, systemtap oder dtrace.
Mark Plotnick
Für die obige Frage könnte eine Lösung darin bestehen, ein Programm zu haben, das die Namen und Pids von Prozessen ausgibt, wenn sie erstellt werden. - Wie sind sie geschaffen? Klingt so, als ob Sie an einen Beobachter denken (so nennen sie sie in der Webbrowser-Welt). Ich frage mich, ob Python als "Türwächter" geeignet wäre. Fakten sind, dass Python sehr tief in das Innenleben des Systems eindringen kann (z dbus. B. ).
Syntaxfehler
1
@syntaxerror DBus ist in diesem Fall weit von der inneren Funktionsweise des Systems entfernt - es geht tatsächlich um zwei Ebenen über dem, was hier diskutiert wird.
Peterph
OK, im OSI-Jargon ist die hier diskutierte Stufe möglicherweise immer noch niedriger als die von dbus. Ich gebe zu, dass ich nicht gründlich darüber nachgedacht hatte, ob sich beide auf derselben Ebene befinden oder nicht.
Syntaxfehler

Antworten:

6

Linux-spezifische Antwort:

perf-tools enthält einen execsnoop , der genau dies tut. Es verwendet verschiedene Linux-spezifische Funktionen wie ftrace. Auf Debian ist es im Paket perf-tools-unstable enthalten.

Beispiel für mich man catin einem anderen Terminal:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

Ich bezweifle, dass es einen tragbaren Weg gibt, dies zu tun.

derobert
quelle
2

Es Right Way TM dies zu tun , hängt stark von welchem System und Kernel Sie tatsächlich läuft. DTrace sollte unter Solaris, Free / NetBSD und Linux funktionieren.

Speziell für Linux können Sie entweder ftrace (das zum Zeitpunkt der Kompilierung aktiviert werden muss - normalerweise) oder proc-Ereignisse über netlink verwenden. Weitere Informationen finden Sie in der SO-Antwort auf das Problem (und denken Sie daran, die Punktzahl ~ abzustimmen 30 gegen 0 für akzeptierte Antwort sieht lustig aus). Der Tracer des armen Mannes könnte wahrscheinlich mithilfe von implementiert werden strace -eexec,fork(wenn auch mit unangemessenem Overhead).

Peterph
quelle