Ejecute un comando arbitrario cuando un servicio falla

11

Quiero ejecutar algún script cuando falla un servicio. Lo más parecido a esto es la FailureAction=opción (en la [Service]sección), pero solo ofrece comandos de reinicio.

tshepang
fuente

Respuestas:

11

Hay una OnFailure=directiva en la sección [Unit], documentada en systemd.unit (5) . Se define de la siguiente manera:

Una lista separada por espacios de una o más unidades que se activan cuando esta unidad entra en el estado "fallido".

(También hay una OnFailureJobMode=directiva en la misma sección que permite establecer el modo de trabajo para activar OnFailure = unidades).

intelfx
fuente
Parece que esas opciones inician otras unidades en lugar de solo scripts.
tshepang
2
@ Tshepang: Por supuesto. En systemd, una unidad es, bueno, una unidad básica de hacer cualquier cosa. Escriba una unidad simple para su guión, póngala debajo /etc/systemd/systemy coloque su nombre en la OnFailure=directiva.
intelfx
2

También puede usar ExecStopPostpara ejecutar un comando directamente en lugar de iniciar una unidad.

No estaba contento con el OnFailureentorno, así que seguí buscando y encontrando ExecStopPost.

El siguiente ejemplo real, si la tarea principal falla, systemd ejecutará 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 = Comandos adicionales que se ejecutan después de que se detiene el servicio. Esto incluye casos en los que se utilizaron los comandos configurados en ExecStop =, donde el servicio no tiene definido ningún ExecStop =, o donde el servicio se cerró inesperadamente. Este argumento toma varias líneas de comando, siguiendo el mismo esquema que se describe para ExecStart =. El uso de estas configuraciones es opcional. Se admite la sustitución de especificador y variable de entorno. Tenga en cuenta que, a diferencia de ExecStop =, los comandos especificados con esta configuración se invocan cuando un servicio no se inicia correctamente y se cierra de nuevo.

Se recomienda utilizar esta configuración para las operaciones de limpieza que se ejecutarán incluso cuando el servicio no se inicie correctamente. Los comandos configurados con esta configuración deben poder funcionar incluso si el servicio falla al iniciarse a mitad de camino y deja datos incompletos inicializados. Como los procesos del servicio ya han finalizado cuando se ejecutan los comandos especificados con esta configuración, no deben intentar comunicarse con ellos.

Tenga en cuenta que todos los comandos que se configuran con esta configuración se invocan con el código de resultado del servicio, así como con el código y el estado de salida del proceso principal, establecidos en las variables de entorno $ SERVICE_RESULT, $ EXIT_CODE y $ EXIT_STATUS, consulte systemd.exec (5) para más detalles.

musaraña
fuente