Lassen Sie die Überwachung länger warten, bevor Sie denken, etwas sei tot

20

Ich versuche, ein Programm (Resque) zu starten, aber es dauert ein bisschen, bis eine PID-Datei geschrieben wird. Daher denke ich, dass Monit denkt, dass das Programm noch nicht gestartet wurde und ein oder zwei weitere Programme startet, bevor das Pidfile des ersten geschrieben wird.

Wie verzögere ich die erneute Überprüfung durch Monit, nur für diesen Vorgang? Oder soll ich das anders lösen?

Ramon Tayag
quelle
Ich habe unten eine neue Antwort hinzugefügt. Ein längeres Warten zwischen Überprüfungen verhindert zwar Kollisionen bei langsamen Diensten, kann jedoch für Kunden eine sehr schlechte Erfahrung sein.
Eddie

Antworten:

10

Wie verzögere ich die erneute Überprüfung durch Monit, nur für diesen Vorgang?


Was Sie erreichen möchten, können Sie mit der Funktion " SERVICE POLL TIME " von monit erledigen

Monit Dokumentation sagt

Die Dienste werden in regelmäßigen Abständen von der geprüft

set daemon n

Aussage. Überprüfungen werden in der gleichen Reihenfolge ausgeführt, in der sie in die .monitrc-Datei geschrieben wurden, außer wenn Abhängigkeiten zwischen Diensten eingerichtet wurden. In diesem Fall kann die Diensthierarchie die Reihenfolge der Überprüfungen ändern.

Eine der Methoden zum Anpassen der Dienstabfrage ist

  1. Benutzerdefiniertes Intervall basierend auf der mehrfachen Länge des Abfragezyklus

JEDE [Anzahl] ZYKLEN

Beispiel:

check process resque with pidfile /your/app/root/tmp/pid/resque.pid
   every 2 cycles

Oder soll ich das anders lösen?


Ich habe auch den ersten Versuch unternommen, Resque-Jobs mit monit zu überwachen, da monit ein sehr leichter Daemon ist, der sich aber schließlich mit GOTT abgefunden hat. Ich weiß, ich weiß, dass GOTT im Vergleich zu Monit ressourcenhungriger ist, aber im Falle von Resque fanden wir, dass es eine gute Übereinstimmung ist.

kaji
quelle
Vielen Dank! Am Ende habe ich alle x Zyklen verwendet. Ich habe gerade die Nummer gefunden, die für mich funktioniert hat.
Ramon Tayag
19

Sie können einen bestimmten Dienst in einem anderen Intervall als dem Standardintervall überprüfen.

Siehe SERVICE- ABRUFZEIT in der Monit-Dokumentation.

Ein Beispiel für Ihr Resque-Programm wäre die Überprüfung einer anderen Anzahl von Zyklen:

check process resque with pidfile /var/run/resque.pid
   every 5 cycles

oder aus dem Beispielteil:

Some servers are slow starters, like for example Java based Application Servers. 
So if we want to keep the poll-cycle low (i.e. < 60 seconds) but allow some services to take its time to start, 
the every statement is handy:

 check process dynamo with pidfile /etc/dynamo.pid every 2 cycles
       start program = "/etc/init.d/dynamo start"
       stop program  = "/etc/init.d/dynamo stop"
       if failed port 8840 then alert

Oder Sie können die Cron-Style-Checks nutzen.

check process resque with pidfile /var/run/resque.pid
   every 10 * * * *

Bei einem langsamen Start können Sie das Zeitlimit im Befehl service start verlängern:

check process apache with pidfile /var/run/httpd.pid
       start program = "/etc/init.d/httpd start" with timeout 90 seconds
ewwhite
quelle
Gleiche Antwort, richtig?
ewwhite
2
with timeout 90 secondswar genau das, was ich wollte. Vielen Dank.
Andrew
1
Ein großes Lob für das Einbeziehen von Timeouts und Cron-Stil. Dies ist die genaueste und vollständigste Antwort.
Cross
9

Sie können auch überprüfen, ob X-mal hintereinander ein Fehler aufgetreten ist:

 if failed 
    port 80 
    for 10 cycles 
 then alert

Oder für X-mal innerhalb von Y-Umfragen:

 if failed 
    port 80
    for 3 times within 5 cycles 
 then alert

Oder beides:

 check filesystem rootfs with path /dev/hda1
  if space usage > 80% for 5 times within 15 cycles then alert
  if space usage > 90% for 5 cycles then exec '/try/to/free/the/space'

( von hier )

Vaiden
quelle
1
Dies ist eine weitere sehr gute Antwort, da sie zeigt, wie Sie das Standardintervall überprüfen, aber nur verzeihender vorgehen können.
RCross
2

Ein Mitglied meines Teams hat eine ziemlich clevere Lösung gefunden, mit der die Überwachung häufig (jede Minute) überprüft werden kann. Wenn jedoch versucht wurde, den Dienst neu zu starten (dies dauert ca. 10 Minuten), wartet die Überwachung eine bestimmte Frist, bevor sie gestartet wird nochmal.

Dies verhindert, dass zu lange zwischen den Überprüfungen gewartet wird, was in Verbindung mit einem langsamen Start für die Kunden eine viel größere Auswirkung hat. Es funktioniert mithilfe eines Zwischenskripts, das als Flag fungiert, um anzuzeigen, dass die Überwachung bereits nach dem letzten Fehler aktiv ist.

check host bamboo with address bamboo.mysite.com
   if failed
           port 443 type tcpSSL protocol http
           and status = 200
           and request /about.action
            for 3 cycles
   then exec "/bin/bash -c 'ps -ef | grep -v "$$" | grep -v "grep" | grep restartBamboo.sh >/dev/null 2>&1; if [ $? -ne 0 ]; then /opt/monit/scripts/restartBamboo.sh; fi'"

Wenn bamboo (langsam startende Webanwendung) 3 Minuten hintereinander nicht funktioniert, starten Sie neu, ABER nur, wenn noch kein Neustart-Skript ausgeführt wird.

Das aufgerufene Skript hat einen festgelegten Ruhezustand, der auf LÄNGER wartet, dann auf die langsamste Startzeit für den Dienst (in unserem Fall erwarten wir, in ~ 10 zu enden, sodass wir für 15 schlafen).

#!/bin/bash
echo "Retarting bambo by calling init.d"
/etc/init.d/bamboo stop
echo "Stopped completed, calling start"
/etc/init.d/bamboo start
echo "Done restarting bamboo, but it will run in background for sometime before available so, we are sleeping for 15 minutes"
sleep 900
echo "done sleeping"
Eddie
quelle
2

Die aktuelle Version von Monit (5.16) unterstützt ein Timeout für die Startskripte mit der Syntax:

 <START | STOP | RESTART> [PROGRAM] = "program"
    [[AS] UID <number | string>]
    [[AS] GID <number | string>]
    [[WITH] TIMEOUT <number> SECOND(S)]

In den Dokumenten heißt es :

Bei einer Prozessüberprüfung wartet Monit bis zu 30 Sekunden, bis die Start- / Stopp-Aktion beendet ist, bevor er aufgibt und einen Fehler meldet. Sie können dieses Zeitlimit mit der Option TIMEOUT überschreiben.

Welches ist, was der "Timeout" -Wert tun wird.

Jeteon
quelle
Das Verlängern des Timeouts funktioniert, wenn der eigentliche Start lange dauert, aber in der ursprünglichen Frage scheint es, dass das Programm möglicherweise schnell gestartet wurde (dh zurückgegeben wurde), aber die PID nicht sofort ausgeschrieben hat. Gibt es eine Möglichkeit, monit anzuweisen, den Dienst nach dem Neustart für eine bestimmte Zeit nicht zu überprüfen?
PeterVermont
Das timeoutsollte sowohl für Starts als auch für Neustarts gelten. Soweit ich weiß, verzögert es sich, bis Monit überprüft, ob: a) ausgeführt wird, b) die erwartete PID-Datei erstellt wird und c) derzeit ein Prozess mit der erwarteten PID ausgeführt wird. Ich hatte einige Probleme damit, es zum Laufen zu bringen, wenn die angegebene Anwendung nur ein Skript war, das den eigentlichen Prozess auslöste, und dann zurückkam, ohne zu wissen, was mit dem Prozess geschah. In diesem Fall war es ein Schmerz, es zum Laufen zu bringen.
Jeteon
Was ist mit dem Neustart des Systems und dem Starten der Dienste? Gibt es eine Möglichkeit, eine anfängliche Verzögerung in Sekunden für jede Überprüfung anzugeben? auch die passiven Prüfungen ohne Start / Stopp-Anweisungen
Massimo
Ich glaube, in diesem Fall könnten Sie suchen START DELAY.
Jeteon