J'ai lu la page de manuel du service systemd à quelques reprises, mais je n'arrive toujours pas à comprendre un modèle de base systemd:
Je veux exécuter un processus de démarrage une fois (comme un conteneur Docker ou formater un lecteur) au démarrage, avec succès jusqu'à la fin. Mais si j'utilise Type = oneshot pour cela, je ne peux pas utiliser Restart = en cas d'échec, et s'il échoue, il ne recommencera pas le travail. Suis-je en train de manquer quelque chose d'évident ici?
J'ai également essayé de définir Type = simple avec Restart = on-failure, mais cela dans de nombreux cas, j'ai besoin du comportement suivant (à partir de la page de manuel) que les services oneshot donnent:
Le comportement de one-shot est similaire à simple; cependant, il est prévu que le processus doit se terminer avant que systemd ne démarre les unités de suivi.
Mises à jour:
Restart
et à bouclermy_cmd
comme ceciExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'
:, avec uneTimeoutStartSec
valeur raisonnable .Restart=
définissantFailureAction=[self.unit]
(remplacer [self.unit] par le nom de l'unité). C'est un peu hacky, mais au moins explicite et assez facile à suivre.FailureAction
prend les mêmes valeurs queStartLimitAction
, et tous saufnone
déclencher un arrêt quelconque.Réponses:
Une solution possible que j'essaie est
Où le script
tag.sh
seratouch /ack/TAG_SUCCESS
à la fin de l'exécution. Je crois que cela se rapproche assez du comportement souhaité, carExecStartPre
il s'exécutera séquentiellement, en attendant la fin réussie avant d'appelerExecStart
et l'unité n'est prise en compte qu'uneStarting
foisExecStart
appelée, à quel point nous sommes sûrs d'avoir terminé la tâche de démarrage.Mais cela ressemble toujours à un hack géant?
la source
RemainAfterExit=yes
pour que l'unité reste "active" afin que les autres unités puissent en dépendre.