Wie steuere ich die Rate der automatischen Neustarts eines Runit-Dienstes?

8

Ich habe diesen Runit-Service mit runund log/runSkripte funktionieren ordnungsgemäß.

Der Dienst selbst kann aus externen Gründen abstürzen und möglicherweise erst nach vielen Minuten gestartet werden. Standardmäßig behandelt runit diese Situation, indem der Dienst alle paar Sekunden neu gestartet wird. Wie ändere ich dieses Verhalten?

Meine letzte Erkenntnis war, ein checkSkript hinzuzufügen und dort etwas zu zaubern, aber es scheint viel komplizierter zu sein, als es sein sollte. Gibt es einen einfacheren Weg?

jpbochi
quelle

Antworten:

3

Ich bin mit dieser Funktion nicht vertraut. Wenn es jedoch meine Aufgabe wäre, dieses Problem zu lösen, und ein sehr kurzes Lesen der Manpage keinen einfachen Knopf zum Einstellen dieses Verhaltens bietet, würde ich Folgendes tun:

Erweitern Sie entweder das vorhandene Service-Startskript, oder fügen Sie, wenn dies umständlich ist, ein neues Startskript in die Kette ein (wodurch wiederum das ursprüngliche Startskript gestartet wird). Anstatt den Dienst sofort zu starten, sollte das neue Startskript prüfen, ob der letzte Start kürzlich genug stattgefunden hat. Dies kann durch Überprüfen einer Signalisierungsdatei erfolgen, die beim vorherigen Start erstellt wurde. Wenn die Datei nicht vorhanden ist, kann das Skript die Datei berühren und den Dienst starten. Wenn die Datei vorhanden ist, sollte das Skript prüfen, ob die Datei alt genug ist. Wenn es nicht alt genug ist, sollte es in einer Schleife warten (schlafen), bis die Datei alt genug wird.

So etwas könnte funktionieren (wartet mindestens 1 Minute zwischen den Neustarts):

#!/bin/bash

SIGNALDIR=/tmp
SIGNALFILE=service.started

while /bin/true; do
        found=`find "${SIGNALDIR}" -maxdepth 1 -name "${SIGNALFILE}" -mmin -1 | wc -l`
        [ "${found}" -eq 0 ] && break
        echo "Waiting"
        sleep 10
done

touch "${SIGNALDIR}/${SIGNALFILE}"
original service start...
Laszlo Valko
quelle
Das ist ein guter Ansatz. Sobald ich es teste, werde ich das Skript mit allen möglichen notwendigen Korrekturen versehen.
Jpbochi
8

Sie sollten Ihre Neustarts in der ./finishDatei für diesen Dienst, der bei abnormaler Beendigung ausgeführt wird, auf die Geschwindigkeit beschränken . Das ./finishSkript erhält den Rückkehrcode von dort ./runund von dort aus können Sie festlegen, was zu tun ist usw. In diesem Fall sollte Ihr ./finishSkript laut über die Fehler schreien und Benachrichtigungen senden und in Flammen herumspringen ...

Avery Payne
quelle
Vielen Dank, dies ist die richtige Antwort, aber leider scheinen moderne Programmierer, die Python, Ruby usw. verwenden, immer Apps zu schreiben, die Unix-Signalen keine Beachtung schenken und überhaupt keine richtigen Exit-Codes bereitstellen.
Figtrap
1
Zurückgegebene Fehlercodes sind anscheinend "uncool", denke ich?
Avery Payne
scheint so. Ich denke, es ist ein großer Rückschritt.
Figtrap
1

Ich bin wirklich kein Fan von Init-basiertem Prozessmanagement (und Runit ist im Grunde ein Init-Ersatz). Wie Sie feststellen, ist ein einfacher Neustart fehlgeschlagener Prozesse, sobald sie absterben, keine besonders gute Strategie. Ich habe init verwendet, um monit neu zu starten, aber das ist soweit es geht. (Möglicherweise könnte OOM-Killer Monit töten).

Daher möchte ich Sie ermutigen, nach einem Ersatz zu suchen, anstatt die Dinge zu reparieren.

Monit ist ziemlich alt, aber es macht den Job gut, und mir ist nichts Besseres bekannt. Es hat die nette Eigenschaft, dass nach dem Start nicht mehr Speicher benötigt werden muss, sodass alles, was in einer Skriptsprache geschrieben ist, die Hölle los ist. Das Letzte, was Sie wollen, ist, dass Ihr Prozessmonitor stirbt, weil er keinen Speicher erhält.

mc0e
quelle
systemd, das in EL7 und den meisten anderen Distributionen enthalten ist, kann diese Situation und eine Vielzahl ähnlicher Situationen mit einer Vielzahl von Optionen nativ bewältigen und macht Prozessmanager wie diese meistens überflüssig.
Michael Hampton
1
Es gibt eine kleine Handvoll Situationen, in denen systemd für die Zielumgebung möglicherweise "zu groß" ist. Und die alte Methode des "Prozessmanagements durch Neustart bis zur Ausführung" wurde größtenteils durch eine ordnungsgemäße Auflösung von Abhängigkeiten ersetzt. Beispiele finden Sie unter skarnet.org/software/s6-rc und jjacky.com/anopa .
Avery Payne