92 votes

Systemd avec plusieurs execStart

Est-il possible de créer un service avec le même script lancé avec différents paramètres d'entrée ?

Exemple:

[Unit]
Description=description du script

[Service]
Type=simple
ExecStart=/script.py paramètres1
ExecStart=/script.py paramètres2
Restart=on-failure

[Install]
WantedBy=multi-user.target

Est-ce possible ?

Sera-t-il lancé en mode sériel ? Ou dans deux processus différents ?

3 votes

Pourquoi diable cela a-t-il été fermé? La question implique clairement un problème spécifique et des outils logiciels utilisés principalement par les programmeurs.

147voto

aleivag Points 1026

Si Type=simple dans votre fichier unité, vous ne pouvez spécifier qu'un seul ExecStart, mais vous pouvez ajouter autant d'ExecStartPre, ExecStartPost, mais rien de tout cela n'est adapté pour les commandes longues, car elles sont exécutées de manière sérielle et tout ce qui démarre est arrêté avant de démarrer le suivant.

Si Type=oneshot vous pouvez spécifier plusieurs ExecStart, ils s'exécutent de manière sérielle et non en parallèle.

Si ce que vous voulez est d'exécuter plusieurs unités en parallèle, il y a quelques choses que vous pouvez faire:

Si elles diffèrent sur 1 paramètre

Vous pouvez utiliser des unités modèles, ainsi vous créez un /etc/systemd/system/foo@.service. REMARQUE: (le @ est important).

[Unit]
Description=description du script %I

[Service]
Type=simple
ExecStart=/script.py %i
Restart=on-failure

[Install]
WantedBy=multi-user.target

Et ensuite vous exécutez:

$ systemctl start foo@paramètre1.service foo@paramètre2.service

ou...

Dépendances de cible

Vous pouvez créer plusieurs unités qui se lient à une seule cible:

#/etc/systemd/system/bar.target
[Unit]
Description=cible bar
Requires=multi-user.target
After=multi-user.target
AllowIsolate=yes

Et ensuite vous modifiez vos unités .service pour être WantedBy=bar.target comme suit:

#/etc/systemd/system/foo@.service
[Unit]
Description=description du script %I

[Service]
Type=simple
ExecStart=/script.py %i
Restart=on-failure

[Install]
WantedBy=bar.target

Ensuite vous activez simplement les services foo que vous voulez en parallèle, et démarrez la cible bar de cette façon:

$ systemctl daemon-reload
$ systemctl enable foo@param1.service
$ systemctl enable foo@param2.service
$ systemctl start bar.target

REMARQUE: que cela fonctionne avec tout type d'unités pas seulement les unités modèles.

2 votes

Très belle solution! Mais notez que systemctl stop bar.target ne arrête aucun de ces services liés :'(

0 votes

@aleivag que se passe-t-il si je veux arrêter tous les services en cours d'exécution ? dois-je exécuter systemctl stop foo@param_number.service pour chaque service ? et si j'ai 100 services enregistrés pour la même cible ?

1 votes

@Spartaok tu fais systemctl stop foo@*

31voto

amin khozaei Points 96

Vous pouvez utiliser ExecStartPre ou ExecStartPost pour l'un des scripts

[Unit]
Description=description du script

[Service]
Type=simple
ExecStartPre=/script.py paramètres1
ExecStart=/script.py paramètres2
Restart=on-failure

[Install]
WantedBy=multi-user.target

3 votes

Mais dans le contrôle, je lis « Commandes supplémentaires qui sont exécutées avant ou après la commande dans ExecStart=, respectivement. La syntaxe est la même que pour ExecStart=, sauf que plusieurs lignes de commande sont autorisées et les commandes sont exécutées les unes après les autres, séquentiellement ». Dans votre cas, dois-je attendre que le premier script réussisse avant que le système ne lance le deuxième script ou non? Merci

0 votes

Oui, dans cette solution, vous devriez attendre le succès du premier script. Une autre solution consiste à créer un script bash qui récupère les parameters1 et parameters2 puis les passe aux scripts python.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X