61 votes

redémarrage automatique du service systemd après StartLimitInterval

Je veux que mon service systemd soit automatiquement redémarré en cas d'échec. De plus, je veux limiter le taux de redémarrage. Je veux autoriser un maximum de 3 redémarrages sur une durée de 90 secondes. J'ai donc effectué la configuration suivante.

[Service]  
Restart=always  
StartLimitInterval=90  
StartLimitBurst=3

Désormais, le service est redémarré en cas d'échec. Après 3 échecs/redémarrages rapides, il ne redémarre plus comme prévu. Je m'attendais à ce que systemd démarre le service après le délai d'attente ( StartLimitInterval ). Mais le systemd ne démarre pas automatiquement le service après le timeout (90sec), si je redémarre manuellement le service après le timeout cela fonctionne. Mais je veux que le systemd démarre automatiquement le service après le timeout. StartLimitInterval . Merci de m'indiquer comment réaliser cette fonctionnalité.

61voto

jross Points 639

Pour qu'un service redémarre 3 fois à 90 secondes d'intervalle, incluez les lignes suivantes dans votre fichier de service systemd :

[Unit]
StartLimitIntervalSec=400
StartLimitBurst=3
[Service]
Restart=always
RestartSec=90

Avant systemd-230 il s'appelait juste StartLimitInterval :

[Unit]
StartLimitInterval=400
StartLimitBurst=3
[Service]
Restart=always
RestartSec=90

Cela a fonctionné pour moi dans le cas d'un service qui exécute un script à l'aide de Type=idle . Il convient de noter que StartLimitIntervalSec doit être supérieur à RestartSec * StartLimitBurst sinon le service sera redémarré indéfiniment.

Il m'a fallu du temps et beaucoup d'essais et d'erreurs pour comprendre comment systemd utilise ces options, ce qui suggère que systemd n'est pas aussi bien documenté qu'on pourrait l'espérer. Ces options fournissent effectivement la durée du cycle de réessai et le nombre maximal de réessais que je recherchais.

Références : https://manpages.debian.org/testing/systemd/systemd.unit.5.en.html pour la section de l'unité https://manpages.debian.org/testing/systemd/systemd.exec.5.en.html pour la section Service

24voto

Ingo Points 386

Quelques années plus tard et avec systemd 232 il ne fonctionne plus comme décrit dans la question et dans les réponses de 2016. Nom de l'option StartLimitIntervalSec et les sections ont changé. Il doit maintenant ressembler à cet exemple :

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

Cela permettra d'effectuer 5 redémarrages en 30 secondes (5*6) plus un redémarrage en 33 secondes. Nous avons donc 6 redémarrages en 33 secondes. Cela dépasse la limite de 5 redémarrages en 33 secondes. Les redémarrages s'arrêteront donc à 5 après environ 31 secondes.

12voto

Youssef Eldakar Points 131

Le comportement que vous décrivez est conforme à la documentation :

StartLimitInterval=, StartLimitBurst=, StartLimitBurst=, StartLimitBurst=, StartLimitBurst=. Configurer la limitation du taux de démarrage du service. Par défaut, les services qui sont démarrés plus de 5 fois en l'espace de 10 secondes ne sont plus autorisés à démarrer jusqu'à la fin de l'intervalle de 10 secondes. Ces deux options permettent de modifier cette limitation de vitesse. Utilisez StartLimitInterval= pour configurer l'intervalle de vérification (la valeur par défaut est DefaultStartLimitInterval= dans le fichier de configuration du gestionnaire ; mettez-la à 0 pour désactiver tout type de limitation de vitesse). Utilisez StartLimitBurst= pour configurer le nombre de démarrages autorisés par intervalle (la valeur par défaut est DefaultStartLimitBurst= dans le fichier de configuration du gestionnaire). Ces options de configuration sont particulièrement utiles en conjonction avec Restart= ; cependant, elles s'appliquent à tous les types de démarrage (y compris manuel), et pas seulement à ceux déclenchés par la logique Restart=. Notez que les unités configurées pour Redémarrage= et qui atteignent la limite de démarrage ne sont plus tentées de redémarrer ; cependant, elles peuvent encore être redémarrées manuellement à un moment ultérieur, à partir duquel la logique de redémarrage est à nouveau activée. Notez que systemctl reset-failed entraîne le vidage du compteur de taux de redémarrage d'un service, ce qui est utile si l'administrateur souhaite démarrer manuellement un service et que la limite de démarrage interfère avec cette opération.

J'essaie toujours de trouver un moyen d'obtenir le comportement que vous souhaitez.

2voto

Vous pouvez définir OnFailure pour démarrer un autre service en cas d'échec. Dans le service en cas de défaillance vous pouvez exécuter un script qui attend puis redémarre votre service.

Pour un exemple de mise en place, voir Message d'état de Systemd en cas de défaillance de l'unité et la modifier pour redémarrer le service à la place.

2voto

mcv Points 21

Y StartLimitAction=reboot . Cela redémarre le système après l'intervalle StartLimitInterval.

S Configure l'action à entreprendre si la limite de débit configurée avec StartLimitInterval= et StartLimitBurst= est atteinte. Prend l'une des mesures suivantes [ ] ou reboot-immediate. Si aucune valeur n'est définie, l'atteinte de la limite de débit ne déclenche aucune action, si ce n'est que le démarrage n'est pas autorisé. [ ] après la procédure d'arrêt normale (c'est-à-dire l'équivalent de systemctl reboot). reboot-force provoque un redémarrage forcé qui met fin à tous les processus. [ ] processus mais ne devrait pas endommager les systèmes de fichiers au redémarrage (équivalent à systemctl reboot -f) et reboot-immediate provoque l'exécution immédiate de la procédure de redémarrage. [ ] reboot(2), ce qui peut entraîner une perte de données. La valeur par défaut est none.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X