Vor einigen Jahren hat ein Mitarbeiter eine elegante Lösung für ein Watchdog-Programm gefunden. Das Programm wurde unter Windows ausgeführt und verwendete Windows-Ereignisobjekte , um die Prozesshandles (PIDs) mehrerer Anwendungen zu überwachen. Wenn einer der Prozesse unerwartet beendet wird, ist sein Prozess-Handle nicht mehr vorhanden und sein Watchdog wird sofort signalisiert. Der Watchdog ergreift dann eine geeignete Maßnahme, um das System zu "heilen".
Meine Frage ist, wie würden Sie einen solchen Watchdog unter Linux implementieren? Gibt es eine Möglichkeit für ein einzelnes Programm, die PIDs vieler anderer zu überwachen?
linux
process
monitoring
Justin Ethier
quelle
quelle
Antworten:
Die traditionelle, tragbare und häufig verwendete Methode besteht darin, dass der übergeordnete Prozess seine untergeordneten Elemente überwacht.
Die grundlegenden Primitiven sind die
wait
undwaitpid
Systemaufrufe. Wenn ein untergeordneter Prozess stirbt, erhält der übergeordnete Prozess einSIGCHLD
Signal, in dem er anruft, umwait
zu wissen, welches Kind gestorben ist und welchen Beendigungsstatus es hat . Der übergeordnete Prozess kann stattdessen nach Belieben ignorierenSIGCHLD
und aufrufenwaitpid(-1, &status, WNOHANG)
.Um viele Prozesse zu überwachen, würden Sie sie entweder alle vom selben übergeordneten Element erzeugen oder sie alle über einen einfachen Überwachungsprozess aufrufen, der nur das gewünschte Programm aufruft, darauf wartet, dass es beendet wird und über die Beendigung berichtet (in Shell-Syntax:)
myprogram; echo myprogram $? >>/var/run/monitor-collector-pipe
. Wenn Sie aus der Windows-Welt kommen, beachten Sie, dass kleine Programme, die eine spezielle Aufgabe ausführen, in der Unix-Welt häufig verwendet werden. Das Betriebssystem wurde entwickelt, um Prozesse kostengünstig zu gestalten.Es gibt viele Prozessüberwachungsprogramme (auch Supervisor-Programme genannt), die melden können, wann ein Prozess abbricht und ihn optional neu starten, und vieles mehr: Monit , Supervise , Upstart , ...
quelle
Mein Ansatz für dieses Problem besteht darin, init und seine integrierte Respawn-Direktive zu verwenden, um alles zu starten / neu zu starten, was Sie ausführen müssen. Dies war seine ursprüngliche Absicht und Hauptaufgabe. In einigen Fällen müssen Sie ein Skript ausführen, um nach dem Abbruch eines Prozesses zu bereinigen oder um den Start des Prozesses vorzubereiten (die meiste Zeit ist die Arbeit dieselbe). In den meisten Fällen funktioniert ein Bash-Skript, das mit exec endet, hervorragend.
quelle