Remarque: j'ai écrit un article sur Medium qui explique comment créer un service et comment éviter ce problème particulier: Création d'un service Linux avec systemd .
Question originale:
J'utilise systemd pour garder un script de travail actif à tout moment:
[Unit]
Description=My worker
After=mysqld.service
[Service]
Type=simple
Restart=always
ExecStart=/path/to/script
[Install]
WantedBy=multi-user.target
Bien que le redémarrage fonctionne correctement si le script se ferme normalement après quelques minutes, j'ai remarqué que s'il échouait à plusieurs reprises au démarrage, il systemd
cesserait simplement d'essayer de le démarrer:
Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.
De même, si mon script de travail échoue plusieurs fois avec un état de sortie égal à 255
, systemd
renonce à essayer de le redémarrer:
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.
Y a-t-il un moyen de forcer systemd
à toujours réessayer après quelques secondes?
StartLimitIntervalSec=0
and voilà.Oui , il y a. Vous pouvez spécifier de réessayer après
x
quelques secondes dans la[Service]
section,Après avoir enregistré le fichier, vous devez recharger les configurations du démon pour vous assurer qu’il
systemd
est au courant du nouveau fichier.puis redémarrez le service pour activer les modifications,
Comme vous avez demandé, en regardant la documentation,
sonne comme une recommandation décente.
la source
RestartSec
directive,systemd
plusieurs tentatives de redémarrage redémarrent très rapidement, puis entrent dans un état d'échec permanent; quelque chose qui ne peut pas arriver quandRestartSec
est spécifié?always
c'est un sur-ensemble deon-failure
, donc ça ne va pas aider!Non, systemd renonce à essayer de le redémarrer pendant un moment . Ceci est clairement indiqué dans le journal que vous fournissez:
C’est une limitation du taux d’entrée en vigueur.
La durée du peu de temps est spécifiée dans l'unité de service à l'aide du
StartLimitIntervalSec=
paramètre. Le nombre de démarrages nécessaires dans cet intervalle pour déclencher le mécanisme de limitation de débit est spécifié via leStartLimitBurst=
paramètre. Si rien sur votre système ne diffère de vanilla systemd, y compris les valeurs par défaut pour ces deux paramètres, le délai est de 5 fois inférieur à 10 secondes.StartLimitIntervalSec=0
désactive la limitation du taux, ainsi systemd réessayera pour toujours plutôt que d'abandonner. Toutefois, il est préférable de ne pas quitter le service trop souvent ou de le laisser suffisamment inactif entre les sorties et les redémarrages pour qu'il ne dépasse pas le seuil de limitation de débit.Notez que la limitation du débit ne tient pas compte de la façon dont votre service est abandonné. Il déclenche le nombre de tentatives de démarrage / redémarrage, quelle qu'en soit la cause.
Lectures complémentaires
systemd.unit
. pages de manuel systemd. freedesktop.org.la source
StartLimitIntervalSec=10
etStartLimitIntervalSec=5
, pas de chance.StartLimitIntervalSec=0
.