Umgebungsvariablen in systemd ExecStart- und ExecStop-Klauseln funktionieren nicht wie erwartet

Umgebungsvariablen in systemd ExecStart- und ExecStop-Klauseln funktionieren nicht wie erwartet

Ich arbeite an einigen Unit-Dateien für einige systemd-Dienste. Der Pfadpräfix zu einigen meiner Binärdateien ist ziemlich lang und sie werden mehrmals in den Klauseln ExecStart=, ExecStartPost= und ExecStop= verwendet.

Ich habe einige Umgebungsvariablen definiert (die auch an den Dienst übergeben werden müssen), zB:

Environment=ORACLE_HOME=/u01/app/oracle/product/19/db_1

Aus dem Abschnitt „Befehlszeilen“ in systemd.service(5) geht hervor, dass ich in der Lage sein sollte, die Variablenerweiterung in den Exec*=-Klauseln zu verwenden – zB:

ExecStart=${ORACLE_HOME}/bin/dbstart

Wenn ich das versuche und ein systemctl daemon-reload ausführe, erhalte ich den folgenden Fehler im Journal:

systemd[1]: [/usr/lib/systemd/system/oracle.service:37] Executable path is not absolute, ignoring: ${ORACLE_HOME}/bin/dbstart /u01/app/oracle/product/19/db_1

Aus den systemd-Dokumenten geht ziemlich eindeutig hervor, dass der Pfad zur auszuführenden Datei (mit Ausnahme der zulässigen Präfixe) mit / beginnen muss. Gibt es aber eine Nuance in der Syntax, die ich übersehe und die es mir ermöglichen würde, das zu tun, was ich möchte?

Schließlich möchte ich Dateien mit den verwendeten Umgebungsvariablen haben, sodass sie in den Systemd-Unit-Dateien und auch zum Einrichten von Profilen usw. verwendet werden können.

Ich verwende RHEL7 und RHEL8.

Antwort1

Sie können Umgebungsvariablen verwenden, jedoch nicht als Befehlsnamen. Der Abschnitt „Befehlszeilen“ vonsystemd.service(5)besagt, dass

Beachten Sie, dass das erste Argument (also das auszuführende Programm) keine Variable sein darf.

verwandte Informationen