Esegui un comando arbitrario quando un servizio fallisce


11

Voglio eseguire alcuni script quando un servizio fallisce. La cosa più vicina a questa è l' FailureAction=opzione (nella [Service]sezione), ma offre solo comandi di riavvio.

Risposte:


11

C'è una OnFailure=direttiva nella sezione [Unit], documentata in systemd.unit (5) . È definito come segue:

Un elenco separato da spazi di una o più unità che vengono attivate quando questa unità entra nello stato "non riuscito".

(C'è anche una OnFailureJobMode=direttiva nella stessa sezione che consente di impostare la modalità di lavoro per l'attivazione di OnFailure = unità.)


Sembra che queste opzioni avviano altre unità anziché solo script.
Tshepang,

2
@Tshepang: Certo. In systemd, un'unità è, beh, un'unità base per fare qualsiasi cosa. Scrivi una semplice unità per il tuo script, mettilo sotto /etc/systemd/systeme inserisci il suo nome nella OnFailure=direttiva.
intelfx,

2

È inoltre possibile utilizzare ExecStopPostper eseguire direttamente un comando invece di avviare un'unità.

Non ero contento OnFailuredell'ambientazione, quindi ho continuato a cercare e trovare ExecStopPost.

Il seguente esempio reale, se l'attività principale non riesce, systemd eseguirà un gitcomando.

[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 = Comandi aggiuntivi che vengono eseguiti dopo l'arresto del servizio. Ciò include i casi in cui sono stati utilizzati i comandi configurati in ExecStop =, in cui il servizio non ha alcun ExecStop = definito o in cui il servizio è uscito inaspettatamente. Questo argomento utilizza più righe di comando, seguendo lo stesso schema descritto per ExecStart =. L'uso di queste impostazioni è facoltativo. È supportata la sostituzione di variabili identificatore e ambiente. Si noti che - diversamente da ExecStop = - i comandi specificati con questa impostazione vengono richiamati quando un servizio non si avvia correttamente e viene nuovamente chiuso.

Si consiglia di utilizzare questa impostazione per le operazioni di pulizia che devono essere eseguite anche quando il servizio non è stato avviato correttamente. I comandi configurati con questa impostazione devono essere in grado di funzionare anche se il servizio non si avviava a metà strada e lasciava i dati inizializzati in modo incompleto. Poiché i processi del servizio sono già stati terminati quando vengono eseguiti i comandi specificati con questa impostazione, non dovrebbero tentare di comunicare con essi.

Si noti che tutti i comandi configurati con questa impostazione vengono richiamati con il codice risultato del servizio, nonché con il codice e lo stato di uscita del processo principale, impostati nelle variabili di ambiente $ SERVICE_RESULT, $ EXIT_CODE e $ EXIT_STATUS, vedere systemd.exec (5) per i dettagli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.