Exécutez une commande arbitraire en cas d'échec d'un service

11

Je veux exécuter un script lorsqu'un service échoue. La chose la plus proche que je vois est l' FailureAction=option (sous la [Service]section), mais elle ne propose que des commandes de redémarrage.

tshepang
la source

Réponses:

11

Il y a une OnFailure=directive dans la section [Unit], documentée dans systemd.unit (5) . Il est défini comme suit:

Une liste séparée par des espaces d'une ou plusieurs unités qui sont activées lorsque cette unité entre dans l'état "échoué".

(Il y a également une OnFailureJobMode=directive dans la même section qui permet de définir le mode de travail pour activer OnFailure = unités.)

intelfx
la source
On dirait que ces options démarrent d'autres unités à la place des scripts.
tshepang
2
@Tshepang: Bien sûr. Dans systemd, une unité est, bien, une unité de base pour faire n'importe quoi. Écrivez une unité simple pour votre script, placez-la sous /etc/systemd/systemet placez son nom dans la OnFailure=directive.
intelfx
2

Vous pouvez également utiliser ExecStopPostpour exécuter une commande directement au lieu de démarrer une unité.

Je n'étais pas satisfait du OnFailurecadre alors j'ai continué à chercher et à trouver ExecStopPost.

L'exemple réel suivant, si la tâche principale échoue, alors systemd exécutera une gitcommande.

[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 = Commandes supplémentaires qui sont exécutées après l'arrêt du service. Cela inclut les cas où les commandes configurées dans ExecStop = ont été utilisées, où le service n'a aucun ExecStop = défini ou où le service s'est arrêté de manière inattendue. Cet argument prend plusieurs lignes de commande, suivant le même schéma que celui décrit pour ExecStart =. L'utilisation de ces paramètres est facultative. La substitution de spécificateurs et de variables d'environnement est prise en charge. Notez que, contrairement à ExecStop =, les commandes spécifiées avec ce paramètre sont appelées lorsqu'un service ne démarre pas correctement et est à nouveau arrêté.

Il est recommandé d'utiliser ce paramètre pour les opérations de nettoyage qui doivent être exécutées même lorsque le service n'a pas démarré correctement. Les commandes configurées avec ce paramètre doivent pouvoir fonctionner même si le service ne démarre pas à mi-chemin et laisse des données incomplètement initialisées. Comme les processus du service sont déjà terminés lorsque les commandes spécifiées avec ce paramètre sont exécutées, ils ne doivent pas tenter de communiquer avec eux.

Notez que toutes les commandes configurées avec ce paramètre sont appelées avec le code de résultat du service, ainsi que le code de sortie et l'état du processus principal, définis dans les variables d'environnement $ SERVICE_RESULT, $ EXIT_CODE et $ EXIT_STATUS, voir systemd.exec (5) pour plus de détails.

musaraigne
la source