web-dev-qa-db-fra.com

Comment faire en sorte qu'il y ait un délai avant qu'un service ne soit démarré dans systemd?

J'ai un service qui dépend de Cassandra qui monte avec élégance et de la grappe est prête et prête.

Pour que l'ordre de dépendance soit respecté, j'ai le fichier d'unité suivant 

[Unit]
Requires=cassandra.service
After=cassandra.service

[Service]
Environment=Java_HOME=/usr/Java/jre
[email protected]@/webapps/bringup-app/bin/bringup
TimeoutStartSec=0
ExecStop=
[email protected]@/logs/bringup.pid
Restart=always

[Install]
WantedBy=multi-user.target

Comment puis-je m'assurer que le processus bringup-app attend 30 secondes avant de tenter de démarrer? Actuellement, bien que démarré après Cassandra, j'ai remarqué que le cluster Cassandra n'est pas encore opérationnel et par conséquent, toute tentative de la part de bringup-app de se connecter à Cassandra lors du démarrage échoue. 

Je veux donc ajouter un délai. Est-ce possible via le fichier d'unité?

19
Sirish Renukumar

Vous pouvez exécuter la commande sleep avant votre ExecStart avec ExecStartPre :

[Service]
ExecStartPre=/bin/sleep 30
26
Ortomala Lokni

Je pense que cette réponse sur le super utilisateur est une meilleure réponse . https://superuser.com/a/573761/67952

Mais puisque vous avez demandé un moyen sans utiliser Avant et Après, vous pouvez utiliser:

Type=idle

qui comme man systemd.service explique

Le comportement du ralenti est très similaire au simple; Toutefois, l'exécution réelle du programme de service est retardée jusqu'à ce que toutes les tâches actives soient envoyées. Ceci peut être utilisé pour éviter l’entrelacement des sorties de Services Shell avec la sortie d'état sur la console. Notez que ce type est utile uniquement pour améliorer la sortie de la console, il n'est pas utile en tant qu'outil de commande d'unité général et son effet le type de service est soumis à un délai d'expiration de 5 secondes, après quoi le programme de service est appelé de toute façon.

5
nelaaro

Vous pouvez créer un fichier unité .timer systemd pour contrôler l'exécution de votre fichier unité .service.

Ainsi, par exemple, pour attendre 1 minute après le démarrage avant de démarrer votre foo.service, créez un fichier foo.timer dans le même répertoire avec le contenu:

[Timer]
OnBootSec=1min

Vous pouvez trouver quelques autres options et toutes les informations nécessaires ici: https://wiki.archlinux.org/index.php/Systemd/Timers

4
Zantsu

Au lieu de modifier le service de rappel, ajoutez un délai post-démarrage au service dont il dépend. Éditez cassandra.service comme suit:

ExecStartPost=/bin/sleep 30

De cette façon, le sommeil supplémentaire ne devrait pas ralentir les redémarrages de la levée.

0
bviktor