Gibt es eine Möglichkeit, Umgebungsvariablen in einer systemd-Service-Unit-Datei dynamisch zuzuweisen?
Wir haben einen Computer mit 4 GPUs und möchten mehrere Instanzen eines bestimmten Dienstes pro GPU hochfahren. Z.B:
- 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
- bis zum Erbrechen
Das 1: 1, 2: 1 usw. ist also effektiv das% i in der Service-Unit-Datei.
Damit der Dienst an eine bestimmte GPU gebunden werden kann, überprüft die ausführbare Dienstdatei eine bestimmte Umgebungsvariable, z.
USE_GPU=4
Gibt es eine Möglichkeit, wie ich% i in die Service Unit-Datei aufnehmen und sie durch eine (Shell-) Funktion ausführen kann, um die GPU-Nummer abzuleiten, und dann die Umgebungsvariable USE_GPU entsprechend festlegen kann?
Am wichtigsten ist, dass ich nicht mühsam mehrere /etc/systemd/system/gpu_service@x:y.service/local.conf
Dateien schreiben muss , nur um mehr Instanzen aufzubauen.
bash -c
auf, um ein Programm aus der Unit-Datei heraus zu starten. Anrufenexec
? Dies ist wie die Verwendung eines Gabelstaplers auf einem Gabelstapler (möglicherweise mit einem anderen Gabelstapler), da der erste Gabelstapler Probleme mit dem Gabelstapler hat.Kein eingebauter Weg. Sie müssen diese Schritte ausführen, bevor Ihr Dienst gestartet wird. Eine Möglichkeit wäre, es in eine Umgebungsdatei zu schreiben.
quelle
Es sieht so aus, als ob Sie tatsächlich Umgebungsvariablen in einer systemd-Unit-Datei festlegen können ...
Per Vorschläge von Kommentatoren ist hier die Lösung:
Zitierter Text aus der folgenden URL: https://coreos.com/os/docs/latest/using-environment-variables-in-systemd-units.html
quelle
Environment=ABC=%i
, wird diese Umgebung eingestellt. Variable "auf die Gesamtheit von% i". Ich vermute, Sie könnten einen Wrapper erstellen, um das "Zeug jenseits des Zitats" zu entfernen, das Sie nicht wollen, und es nennt die echte ausführbare Datei. Aber wenn Sie einen Wrapper%i
ExecStart=my_wrapper %i
Es ist hässlich und nicht ganz das, wonach Sie gefragt haben, und es erlaubt auch keinen Autostart, aber für Follower ist es möglich, etwas in der systemctl- Umgebung zu tun :
Ich versuche nur alle Möglichkeiten aufzulisten :)
quelle