Wie konfiguriere ich „Monit“, um einen Prozess nach seinem Neustart zu überwachen?

Wie konfiguriere ich „Monit“, um einen Prozess nach seinem Neustart zu überwachen?

Ich habemonitso konfiguriert, dass ein Paar Prozesse beendet wird, wenn sie zu viel CPU verbrauchen. Sobald jedoch einer der Prozesse beendet ist, monit summarywird für den Prozess die Meldung „Nicht überwacht“ angezeigt, selbst nachdem das Betriebssystem ihn neu gestartet hat.

Wie konfiguriere ich „Monit“, um einen Prozess nach seinem Neustart zu überwachen?


check process soagent
    matching "soagent"
    stop program = "/usr/bin/pkill -9 soagent"
    if cpu > 20% for 1 cycles then stop
    if cpu > 20% for 1 cycles then alert

check process callservicesd
    matching "callservicesd"
    stop program = "/usr/bin/pkill -9 callservicesd"
    if cpu > 20% for 1 cycles then stop
    if cpu > 20% for 1 cycles then alert 

macOS 10.13.4, monit 5.25.2

Antwort1

Das Problem besteht darin, dass Sie ihm lediglich sagen, den Prozess zu stoppen, wodurch auch die Überwachung beendet wird.

In diesem Fall besteht die einfachste Lösung darin, ein Skript zu schreiben, das launchd anweist, den Prozess neu zu starten (dabei kann ich leider nicht konkret helfen, da ich nicht viel über macOS weiß), und dann eine einzelne Bedingung in der Monit-Konfiguration für jeden Dienst zu verwenden, um das Skript wie folgt auszuführen:

if cpu > 20% for 1 cycles then exec "/path/to/script"

Die execKlausel sendet weiterhin eine E-Mail-Benachrichtigung, wenn sie ausgelöst wird, das Skript wird ausgeführt, um den Prozess/Dienst neu zu starten, und dann wird Monit ihn weiter beobachten, da ihm nicht gesagt wurde, die Beobachtung zu beenden.

Vorausgesetzt, Sie wählen diesen Ansatz, können Sie die stop programZeile auch aus den Definitionen entfernen, da sie nicht verwendet wird, es sei denn, Sie führen sie monit stopauf den Diensten aus.

Bearbeiten, um die Dinge weiter zu verdeutlichen:

Monit geht davon aus, dass das Betriebssystem nicht die Prozessüberwachung übernimmt. Mit anderen Worten, es geht davon aus, dass es das einzige ist, das für das Starten oder Stoppen von Prozessen verantwortlich ist, und wenn Sie ihm sagen, dass es etwas stoppen soll, wird es diesen Prozess stoppen,UndBeenden Sie die Überwachung, da davon ausgegangen wird, dass nichts versucht, es erneut zu starten (und daher ist die Verwendung mit launchd von macOS oder systemd unter Linux manchmal etwas mühsam).

In Ihrem Fall möchten Sie den Prozess neu starten, wenn er zu viel Rechenleistung verbraucht, und Sie werden benachrichtigt, wenn dies geschieht. Mit monit können Sie dies auf zwei Arten tun:

  1. Definieren Sie ein „ start programund“ stop programdafür. Wenn Sie einen separaten Prozess-Supervisor als Init-System verwenden (was bei macOS der Fall ist), sollten dies Befehle sein, die diesen anweisen, das Programm zu starten oder zu stoppen, und dann monit anweisen, den Prozess neu zu starten, wenn die Bedingung eintritt, sowie eine Bedingung hinzufügen, um eine Warnung zu erhalten. Unter macOS benötigen Sie den launchctlBefehl, um den Neustart durchzuführen. Obwohl dies die bevorzugte und „richtige“ Vorgehensweise ist, launchctlist es etwas mühsam, damit zu arbeiten (es scheint davon auszugehen, dass niemand Dienste jemals manuell neu starten möchte), ist dies nicht der Ansatz, den ich empfehlen würde.
  2. Schreiben Sie ein Skript, das den Neustart auslöst, und geben Sie dann den Pfad zu diesem Skript als execAktion für die Bedingung an. execAktionen senden in aktuellen Versionen von Monit implizit Warnungen, sodass Sie in diesem Fall keine Warnungsbedingung angeben müssen. In Ihrem Fall kann das „Skript“ für den ersten Dienst einfach das Folgende sein:

    #!/bin/bash
    /usr/bin/pkill -9 soaagent
    

    Und dann etwas Ähnliches für den zweiten. Das Einzige, was es tun muss, ist, irgendwie den Neustart des Dienstes durch launchd auszulösen, es muss ihn selbst nicht neu starten. Im Wesentlichen sagt dieser Ansatz monit nur, dass es den Neustart auslösen soll, genau wie Sie es oben versuchen, es geschieht nur auf eine etwas sauberere Art und Weise, die das gewünschte Ergebnis erzielt.

verwandte Informationen