Existe-t-il un moyen d'affecter dynamiquement des variables d'environnement dans un fichier d'unité de service systemd?
Nous avons une machine qui possède 4 GPU, et nous voulons faire tourner plusieurs instances d'un certain service par GPU. Par exemple:
- gpu_service @ 1: 1.service
- gpu_service @ 2: 1.service
- gpu_service @ 3: 1.service
- gpu_service @ 4: 1.service
- gpu_service @ 1: 2.service
- gpu_service @ 2: 2.service
- gpu_service @ 3: 2.service
- gpu_service @ 4: 2.service
- à satiété
Ainsi, les 1: 1, 2: 1, etc. sont effectivement le% i dans le fichier d'unité de service.
Pour que le service se lie à un GPU particulier, l'exécutable du service vérifie une certaine variable d'environnement, par exemple:
USE_GPU=4
Existe-t-il un moyen de prendre% i dans le fichier d'unité de service et de l'exécuter via une fonction (shell) pour dériver le numéro de GPU, puis je peux définir la variable d'environnement USE_GPU en conséquence?
Plus important encore, je ne veux pas les tracas de l'écriture de plusieurs /etc/systemd/system/gpu_service@x:y.service/local.conf
fichiers juste pour pouvoir faire tourner plus d'instances.
bash -c
pour démarrer un programme à partir du fichier d'unité? Appelerexec
? C'est comme utiliser un chariot élévateur sur un chariot élévateur (peut-être avec un autre chariot élévateur sur le dessus) parce que le premier chariot élévateur a du mal à le faire.Pas de manière intégrée. Vous devez effectuer ces opérations avant le début de votre service. Une façon serait de le placer dans un fichier d'environnement.
la source
Il semble que vous puissiez en effet définir des variables d'environnement dans un fichier d'unité systemd ...
Selon les suggestions des commentateurs, voici la solution:
Texte cité à partir de l'URL suivante: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
la source
Environment=ABC=%i
cela définit cet env. variable "à l'intégralité de% i". Je suppose que vous pourriez faire un wrapper pour supprimer les "trucs au-delà de la citation" que vous ne voulez pas, et il appelle le véritable exécutable. Mais si vous faites un wrapper, vous pouvez même simplement le passer%i
comme argument ex:ExecStart=my_wrapper %i
C'est moche et pas tout à fait ce que vous avez demandé, ni autoriser le démarrage automatique, mais pour les followers, il est possible de faire quelque chose en utilisant l' environnement systemctl :
J'essaie juste d'énumérer toutes les façons possibles :)
la source