Ajout d'un délai entre l'arrêt et le démarrage d'un processus dans systemd

10

J'ai un problème vraiment étrange avec systemd. Lorsque j'émets un, systemctl restartil démarre le nouveau processus avant la fin du précédent.

Cela peut être vu dans le journal, où le message d'arrêt final ("journal de fermeture") est enregistré après le message de démarrage ("journal d'ouverture").

Existe-t-il un moyen d'ajouter un délai entre l'arrêt et le début du processus?

Šimon Tóth
la source
Rien ne vous empêche de courirsystemctl stop myservice && sleep 3 && systemctl start myservice
don_crissti
Pourquoi est-ce étrange? C'est une fonctionnalité de conception qui vous laisse seul pour contourner les problèmes du monde réel. Injectez le sommeil dans le démarrage de votre unité ou utilisez une condition ExecPre pour vous assurer que l'ancienne instance a complètement disparu.
Florian Heigl

Réponses:

13

Dans vos fichiers de service systemd, vous pouvez définir l'option RestartSec pour ajouter un délai de redémarrage. Voir l'exemple ci-dessous:

[Service]
Restart=always
RestartSec=30

Consultez ce lien pour plus d'exemples.

mmohammad
la source
1
afaik RestartSecne s'applique qu'aux services configurés avec la Restart=directive et n'est pas pris en compte lors d'unsystemctl restart someservice
don_crissti
1

RestartSec ne semble être utilisé que si ce service particulier est celui qui est redémarré via la commande systemctl restart.

Par exemple, j'ai deux services, A et B.

[Unit]
Requires=network-online.target
[Service]
ExecStart=A-stuff
Restart=always

et

[Unit]
Requires=A.service
After=A.service
[Service]
ExecStart=B-stuff
Restart=always
RestartSec=30

Si vous effectuez un redémarrage systemctl B, cela fonctionne comme prévu ... mais si vous effectuez un redémarrage systemctl A, les deux services sont arrêtés et redémarrés immédiatement, sans délai.

Systemd n'utilise apparemment que les valeurs de configuration pour le seul service que vous spécifiez et les ignore pour toutes les dépendances.

Ce n'est pas aussi rare qu'il y paraît. Si B communique avec un serveur distant, le démarrage et l'arrêt rapides peuvent échouer car l'extrémité distante rejette le client. Mais le redémarrage direct de A se produira chaque fois que A est mis à jour sans modification de B.

Vous pouvez probablement contourner cela en ajoutant également le retard à A, mais vous ne devriez pas BESOIN de le faire, car cela rompt l'isolement des objets en faisant connaître A à B quand ce n'est pas une dépendance.

Dread Quixadhal
la source