Kann das System hängengebliebene Prozesse erkennen und stoppen?

16

Während ich an einer Lösung arbeite, die Dateisperrung verwendet, glaube ich, dass mein Code in einen Deadlock gerät. Ich verwende systemd, um den Prozess beim Systemstart zu starten. Die Verwendung von Alarm (3) ist eine Option, aber ich habe mich gefragt, ob systemd blockierte Prozesse erkennen und neu starten kann.

Um dieses Problem vorerst zu umgehen, habe ich vor, mir die journalctl-Ausgabe anzuschauen. Wenn sie sich für einen bestimmten Zeitraum nicht ändert, würde ich den Prozess über ein Shell-Skript beenden.

Ich frage mich nur, ob es eine bessere Möglichkeit gibt, Prozesse über systemd oder auf andere Weise zu überwachen.

Freidenker
quelle
Wahrscheinlich nicht. Wie können Sie feststellen, ob der Prozess hängt? Was ist, wenn Sie wirklich etwas brauchen for(;;) do_something();?
MVP
4
Streng genommen sollten Sie dieses Problem beheben, wenn Ihr Code hängt. Es über systemd zu töten (vorausgesetzt, es kann getan werden, was ich nicht glaube) oder auf andere Weise ist das Richtige, wenn Sie es debuggen. Aber Sie können es einfach nicht frei machen, in eine Sackgasse zu geraten.
MariusMatutiae

Antworten:

25

Ja; aber zuerst das fehlerhafte Programm reparieren, bevor mit systemd herumgespielt wird.

Marius Matutiae ist ganz richtig. Sie haben ein Problem mit Ihrem Programm. Es blockiert. Sich mit systemd zu beschäftigen ist nicht die Antwort. Bestenfalls ist es eine Ablenkung. Korrigieren Sie Ihr Programm, damit es nicht kaputt geht. Lenke deine Energien auf das Richtige.

Das heißt, andere Leute werden wegen des Fragentitels und nicht wegen der eigentlichen Frage hierher kommen. Hier ist die Antwort auf den Titel, wobei die eigentliche Frage ignoriert wird:

Ja, systemd kann Dæmons überwachen und automatisch neu starten, wenn sie aufhören zu sprechen. Aber nicht irgendwelche alten Dæmons. Wie mvp bemerkt, gibt es keine Möglichkeit zu wissen, dass ein Dæmon hängen geblieben ist (zumindest in diesem Universum, in dem das Stopp-Problem nicht zu entscheiden ist). Weder systemd noch ein anderes Computerprogramm wird jemals von Grund auf feststellen können, dass ein zufälliges Programm blockiert ist oder in eine Endlosschleife geraten ist oder was auch immer. Das Beste, was Sie hier finden, ist festzustellen, dass ein Dæmon innerhalb eines bestimmten Zeitraums keine reguläre "Heartbeat" -Operation durchgeführt hat.

Daher müssen Dæmons, die die Watchdog-Funktionen von systemd nutzen, so geschrieben werden, dass sie ein systemd-spezifisches Protokoll, das sd_notify-Protokoll, sprechen. Dies erschwert den Dæmon-Code ein wenig. Es ist noch komplizierter, da Dæmons, wenn sie richtig geschrieben sind, auch prüfen sollten, ob sie mit aktivierter Watchdog-Funktion aufgerufen wurden.

Ein Daemon, das dieses Protokoll spricht, um die Watchdog-Fähigkeit von systemd zu nutzen ...

  • … Muss nach der WATCHDOG_USECUmgebungsvariablen suchen;
  • … Muss sd_notify () während seiner gesamten Lebensdauer kontinuierlich und häufig mit der festgelegten WATCHDOG=1Option in einem Intervall von ungefähr WATCHDOG_USEC/ 2 aufrufen ("USEC" steht für Mikrosekunden);
  • … Muss Type=notifyin seiner Unit-Datei eingestellt sein;
  • … Sollte NotifyAccess=main(oder =all) in seiner Unit-Datei gesetzt haben;
  • … Muss in der Unit-Datei WatchdogSec=Sekunden eingestellt haben .
  • … Muss sich verbinden mit libsystemd-daemon.so

Wenn Sie nach dem Lesen des Handbuchs die Details zur Codierung erfahren möchten, stellen Sie sicher, dass Sie zum richtigen StackExchange wechseln. Das ist SuperUser. StackOverflow ist da drüben .

Weitere Lektüre

  • Lennart Pöttering. 2011-04-12. Wachhunde . Freedesktop.org.
JdeBP
quelle
2
Natürlich muss ich das Problem beheben, meine einzige Absicht war es, einen vorübergehenden Hack durchzuführen, bis ich das Problem herausgefunden habe. Danke für die ausführliche Antwort.
Freidenker