Linux: Einen Watchdog schreiben, um mehrere Prozesse zu überwachen

14

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?

Justin Ethier
quelle
Siehe auch Sicherstellen, dass ein Prozess immer ausgeführt wird, um eine Liste der Überwachungs- / Überwachungsprogramme anzuzeigen.
Gilles 'SO - hör auf, böse zu sein'
Siehe auch stackoverflow: stackoverflow.com/questions/9400724/…
Mike Pennington

Antworten:

17

Die traditionelle, tragbare und häufig verwendete Methode besteht darin, dass der übergeordnete Prozess seine untergeordneten Elemente überwacht.

Die grundlegenden Primitiven sind die waitundwaitpid Systemaufrufe. Wenn ein untergeordneter Prozess stirbt, erhält der übergeordnete Prozess ein SIGCHLDSignal, in dem er anruft, um waitzu wissen, welches Kind gestorben ist und welchen Beendigungsstatus es hat . Der übergeordnete Prozess kann stattdessen nach Belieben ignorieren SIGCHLDund aufrufen waitpid(-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 , ...

Gilles 'SO - hör auf böse zu sein'
quelle
+1, genau das, wonach ich gesucht habe - vielen Dank für eine so ausführliche Antwort.
Justin Ethier
0

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