Führen Sie einen beliebigen Befehl aus, wenn ein Dienst ausfällt

11

Ich möchte ein Skript ausführen, wenn ein Dienst ausfällt. Das nächste, was ich sehe, ist die FailureAction=Option (unter [Service]Abschnitt), aber sie bietet nur Neustartbefehle.

Tshepang
quelle

Antworten:

11

Es gibt eine OnFailure=Anweisung im Abschnitt [Unit], die in systemd.unit (5) dokumentiert ist . Es ist wie folgt definiert:

Eine durch Leerzeichen getrennte Liste einer oder mehrerer Einheiten, die aktiviert werden, wenn diese Einheit in den Status "Fehlgeschlagen" wechselt.

(Außerdem gibt es OnFailureJobMode=im selben Abschnitt eine Anweisung, mit der der Jobmodus zum Aktivieren von OnFailure = Einheiten festgelegt werden kann.)

intelfx
quelle
Sieht so aus, als würden diese Optionen andere Einheiten starten, anstatt nur Skripte.
Tshepang
2
@ Tshepang: Natürlich. In systemd ist eine Einheit eine Grundeinheit , um etwas zu tun. Schreiben Sie eine einfache Einheit für Ihr Skript, setzen Sie sie unter /etc/systemd/systemund setzen Sie ihren Namen in die OnFailure=Direktive.
intelfx
2

Sie können auch ExecStopPosteinen Befehl direkt ausführen, anstatt eine Einheit zu starten.

Ich war mit der OnFailureUmgebung nicht zufrieden , also suchte und fand ich weiter ExecStopPost.

Im folgenden Beispiel führt systemd einen gitBefehl aus , wenn die Hauptaufgabe fehlschlägt .

[Unit]
Description=SRI Dispenser Server
ConditionPathExists=|/usr/bin/
After=sri-boot-dsp.service

[Service]
WorkingDirectory=/usr/share/sri/configurations/transmitter

User=root

# This is task to run when this service starts
ExecStart=/usr/bin/python -m sri.DispenserServer

# If any of the ExecStart tasks fail, then ExecStopPost will run
ExecStopPost=/bin/git checkout -- .

Restart=always
RestartSec=10
KillSignal=SIGKILL


[Install]
WantedBy=multi-user.target

https://www.freedesktop.org/software/systemd/man/systemd.service.html

ExecStopPost = Zusätzliche Befehle, die ausgeführt werden, nachdem der Dienst gestoppt wurde. Dies schließt Fälle ein, in denen die in ExecStop = konfigurierten Befehle verwendet wurden, in denen für den Dienst kein ExecStop = definiert ist oder in denen der Dienst unerwartet beendet wurde. Dieses Argument verwendet mehrere Befehlszeilen und folgt demselben Schema wie für ExecStart = beschrieben. Die Verwendung dieser Einstellungen ist optional. Das Ersetzen von Spezifizierern und Umgebungsvariablen wird unterstützt. Beachten Sie, dass - anders als bei ExecStop = - Befehle, die mit dieser Einstellung angegeben wurden, aufgerufen werden, wenn ein Dienst nicht ordnungsgemäß gestartet und wieder heruntergefahren wurde.

Es wird empfohlen, diese Einstellung für Bereinigungsvorgänge zu verwenden, die auch dann ausgeführt werden sollen, wenn der Dienst nicht ordnungsgemäß gestartet wurde. Mit dieser Einstellung konfigurierte Befehle müssen auch dann ausgeführt werden können, wenn der Dienst auf halbem Weg nicht gestartet werden konnte und unvollständig initialisierte Daten vorhanden waren. Da die Prozesse des Dienstes bereits beendet wurden, als die mit dieser Einstellung angegebenen Befehle ausgeführt wurden, sollten sie nicht versuchen, mit ihnen zu kommunizieren.

Beachten Sie, dass alle Befehle, die mit dieser Einstellung konfiguriert wurden, mit dem Ergebniscode des Dienstes sowie dem Exit-Code und Status des Hauptprozesses aufgerufen werden, der in den Umgebungsvariablen $ SERVICE_RESULT, $ EXIT_CODE und $ EXIT_STATUS festgelegt ist (siehe systemd.exec) (5) für Details.

Spitzmaus
quelle