J'ai un service exécutant un logiciel qui génère des fichiers de configuration s'ils n'existent pas et les lit s'ils existent. Le problème auquel j'ai été confronté est que ces fichiers sont parfois corrompus, empêchant le logiciel de démarrer et provoquant ainsi l'échec du service. Dans ce cas, je voudrais supprimer ces fichiers et redémarrer le service.
J'ai essayé de créer un service qui devrait être exécuté en cas d'échec, en procédant comme suit :
[Service]
ExecStart=/bin/run_program
OnFailure=software-fail.service
où se trouve ce service :
[Service]
ExecStart=/bin/rm /file/to/delete
ExecStop=systemctl --user start software.service
Le problème, cependant, est que ce service ne démarre pas, même en cas d'échec du service.
J'ai essayé de le faire
systemctl --user enable software-fail.service
mais ensuite, il démarre à chaque démarrage du système, comme n'importe quel autre service.
Ma solution temporaire consiste à utiliser
ExecStopPost=/bin/rm /file/to/delete
mais ce n'est pas un moyen satisfaisant de le résoudre, car il supprimera toujours le fichier à l'arrêt du service, que ce soit à cause d'un échec ou non.
Sortie en cas d'échec :
● software.service - Software
Loaded: loaded (/home/trippelganger/.config/systemd/user/software.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Fri 2018-05-04 09:05:26 CEST; 5s ago
Process: 1839 ExecStart=/bin/run_program (code=exited, status=1/FAILURE)
Main PID: 1839 (code=exited, status=1/FAILURE)
May 04 09:05:26 trippelganger systemd[595]: software.service: Main process exited, code=exited, status=1/FAILURE
May 04 09:05:26 trippelganger systemd[595]: software.service: Unit entered failed state.
May 04 09:05:26 trippelganger systemd[595]: software.service: Failed with result 'exit-code'.
La sortie de systemctl –user status software-fail.service
est :
● software-fail.service - Delete corrupt files
Loaded: loaded (/home/trippelganger/.config/systemd/user/software-fail.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Réponse acceptée :
REMARQUE :Vous souhaitez probablement utiliser ExecStopPost=
au lieu de OnFailure=
ici (voir mon autre réponse), mais cela essaie de comprendre pourquoi votre OnFailure=
la configuration ne fonctionne pas.
Le problème avec OnFailure=
ne pas démarrer l'unité peut être parce qu'elle est dans la mauvaise section, elle doit être dans le [Unit]
section et non [Service]
.
Vous pouvez essayer ceci à la place :
# software.service
[Unit]
Description=Software
OnFailure=software-fail.service
[Service]
ExecStart=/bin/run_program
Et :
# software-fail.service
[Unit]
Description=Delete corrupt files
[Service]
ExecStart=/bin/rm /file/to/delete
ExecStop=/bin/systemctl --user start software.service
Je peux le faire fonctionner avec cette configuration.
Mais notez que l'utilisation de OnFailure=
n'est pas idéal ici, car vous ne pouvez pas vraiment dire pourquoi le programme a échoué, et enchaîner un autre démarrage dans ExecStop=
en appelant /bin/systemctl start
directement est assez hacky… La solution utilisant ExecStopPost=
et regarder le statut de sortie est définitivement supérieur.
Si vous définissez OnFailure=
à l'intérieur de [Service]
, systemd (au moins la version 234 de Fedora 27) se plaint avec :
software.service:6: Unknown lvalue 'OnFailure' in section 'Service'
Vous ne savez pas si vous voyez cela dans vos journaux ou non… (Peut-être que cela a été ajouté dans un systemd récent ?) Cela devrait être un indice de ce qui se passe là-bas.
En relation:Différence entre '>' et '-gt'?