Ich schreibe eine systemd-Unit-Datei für eine Java-Anwendung und möchte die zum Starten verwendete Java-Version steuern. Meine (vereinfachte) Servicedatei ist
[Service]
Type=simple
EnvironmentFile=%h/Documents/apps/app/app-%i/app.cfg
ExecStart=${JAVA_HOME}/bin/java ${JAVA_OPTS} -jar %h/Documents/apps/app/app-%i/myapp.jar
SuccessExitStatus=143
Beim Versuch, es zu starten, erhalte ich einen Fehler zurück
Apr 28 12:43:37 rombert systemd[1613]: [/home/robert/.config/systemd/user/[email protected]:7] Executable path is not absolute, ignoring: ${JAVA_HOME}/bin/java ${JAVA_OPT
Apr 28 12:43:37 rombert systemd[1613]: [email protected] lacks both ExecStart= and ExecStop= setting. Refusing.
Ich weiß, dass JAVA_HOME
das richtig eingestellt ist; Wenn ich die ExecStart
Zeile zunächst ändere /usr/bin/java
und dann so etwas hinzufüge, wie -DsomeOption=${JAVA_HOME}
ich es sehen kann, ist das in Ordnung.
Die offensichtliche Problemumgehung besteht darin, ein Wrapper-Skript zu erstellen, aber ich bin der Meinung, dass es den Sinn einer Servicedatei zunichte macht.
Wie kann ich JAVA_HOME für meine Java-Anwendung mithilfe einer Unit-Datei festlegen?
Antworten:
Aus dem Abschnitt "Befehlszeilen" in systemd.service (5):
Ich wollte vorschlagen, den
%i
Instanzspezifizierer zu verwenden (mehr dazu in systemd.unit (5)), aber (jetzt sind wir wieder in systemd.service (5)):Ich denke, die beste Option an dieser Stelle ist die Erstellung eines Shell-Skripts, das die Ausführung der Java-Binärdatei wie von Warren Young vorgeschlagen umschließt, oder Sie könnten eine Shell direkt starten, wie im Beispiel für Shell-Befehlszeilen im Abschnitt "Befehlszeilen" von systemd.service (5) mit folgendem Beispiel:
so könnte man machen (ungetestet):
quelle
Eine andere ähnliche Option ist die Verwendung von
/usr/bin/env
:Auf diese Weise können Sie
'
den gesamten Befehl in Anführungszeichen setzen, was nützlich ist, wenn Sie zitierte Elemente verschachteln müssen.PS. Als Randnotiz ist es wichtig, Variablennamen in
{
Klammern}
in Systemd-Dateien einzuschließen, da sie sonst nicht korrekt erkannt werden.quelle