Uruchom dowolne polecenie w przypadku awarii usługi

12

Chcę uruchomić skrypt w przypadku awarii usługi. Najbliższą rzeczą, jaką widzę, jest FailureAction=opcja (w [Service]sekcji), ale oferuje ona tylko polecenia ponownego uruchomienia.

tshepang
źródło

Odpowiedzi:

11

W OnFailure=sekcji znajduje się dyrektywa [Unit]udokumentowana w systemd.unit (5) . Jest on zdefiniowany w następujący sposób:

Rozdzielona spacjami lista jednej lub więcej jednostek, które są aktywowane, gdy jednostka przechodzi w stan „awarii”.

(W OnFailureJobMode=tej samej sekcji znajduje się również dyrektywa, która pozwala ustawić tryb pracy dla aktywacji OnFailure = jednostek.)

intelfx
źródło
Wygląda na to, że te opcje uruchamiają inne jednostki zamiast skryptów.
tshepang
2
@Tshepang: Oczywiście. W systemie system jest podstawową jednostką robienia czegokolwiek. Napisz prostą jednostkę dla skryptu, umieść ją pod /etc/systemd/systemi umieść jej nazwę w OnFailure=dyrektywie.
intelfx
2

Możesz także użyć ExecStopPostdo uruchomienia polecenia zamiast uruchamiania jednostki.

Nie byłem zadowolony z tego OnFailureustawienia, więc szukałem i znalazłem ExecStopPost.

Poniższy prawdziwy przykład, jeśli główne zadanie nie powiedzie się, systemd uruchomi gitpolecenie.

[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 = Dodatkowe polecenia, które są wykonywane po zatrzymaniu usługi. Obejmuje to przypadki, w których użyto poleceń skonfigurowanych w ExecStop =, w których usługa nie ma zdefiniowanego ExecStop = lub usługa została nieoczekiwanie zamknięta. Ten argument przyjmuje wiele wierszy poleceń, zgodnie z tym samym schematem, co opisany dla ExecStart =. Korzystanie z tych ustawień jest opcjonalne. Obsługiwane jest podstawianie specyfikatora i zmiennych środowiskowych. Zauważ, że - w przeciwieństwie do ExecStop = - polecenia określone z tym ustawieniem są wywoływane, gdy usługa nie uruchomi się poprawnie i zostanie ponownie zamknięta.

Zaleca się stosowanie tego ustawienia do operacji czyszczenia, które będą wykonywane nawet wtedy, gdy usługa nie uruchomi się poprawnie. Polecenia skonfigurowane z tym ustawieniem muszą być w stanie działać, nawet jeśli usługa nie uruchomi się w połowie i pozostawi nie dokończone dane. Ponieważ procesy usługi zostały zakończone już podczas wykonywania poleceń określonych z tym ustawieniem, nie powinny próbować się z nimi komunikować.

Zauważ, że wszystkie polecenia skonfigurowane z tym ustawieniem są wywoływane z kodem wynikowym usługi, a także kodem wyjścia i statusem głównego procesu ustawionym w zmiennych środowiskowych $ SERVICE_RESULT, $ EXIT_CODE i $ EXIT_STATUS, patrz systemd.exec (5) w celu uzyskania szczegółowych informacji.

ryjówka
źródło