Ausgehend von der hier gestellten Frage möchte das OP wiederholt die PID eines Prozesses abfragen, der pidof
in einem Shell-Skript verwendet wird. Dies ist natürlich ineffizient, da ein neuer Prozess für das pidof
Programm 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, stdout
und 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 perl
Skript ist, das wiederholt ausgeführt wird, ps
so dass es das Problem nicht wirklich löst. Eine andere Option ist die Verwendung, auditd
die 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 auditd
Lösung akzeptieren werde, wenn dies die beste Option ist.
quelle
fork
oder der Variante) erstellt wird und dann das neue Programm mit einemexec
Familienmitglied gestartet wird . Sie möchten also wahrscheinlich das protokollierenexec*
, nicht dasfork
.dbus
. B. ).Antworten:
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 cat
in einem anderen Terminal:Ich bezweifle, dass es einen tragbaren Weg gibt, dies zu tun.
quelle
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).quelle