Befehle in ExecStart=
systemd-Diensteinheiten werden nicht wirklich auf einer Shell ausgeführt. Daher sind Shell-Erweiterungen (z. B. die dort verwendete Befehlsersetzung $(...)
) nicht wirklich verfügbar.
Sie können sie verwenden, indem Sie ein Shellskript explizit mit /bin/sh -c '...'
, in, aufrufen ExecStartPre=
. Zum Beispiel:
ExecStartPre=/bin/sh -c 'systemctl set-environment date=$$(/bin/date +%%Y-%%m-%%d-%%H-%%M)'
Beachten Sie, dass Sie das $
selbst mit Hilfe von Escape $$
sichern müssen, andernfalls versucht systemd, die Erweiterung als systemd-Variable zu interpretieren. (Tatsächlich könnte (
ein Single wie das nächste Zeichen $
dort funktionieren, aber das Verdoppeln ist das korrekte Setup.)
Bitte beachten Sie, dass die Verwendung der von systemctl set-environment
Ihnen verwendeten Art wirklich nicht empfohlen wird, da Sie eine globale Umgebungsvariable $
erstellen, die überall verfügbar ist.
Überlegen Sie sich stattdessen, Ihren ExecStart=
Befehl über eine Shell auszuführen. In diesem Fall können Sie eine Shell-Variable definieren $
und sie einfach an der gewünschten Stelle verwenden:
ExecStart=/bin/sh -c 'date=$$(/bin/date +%%Y-%%m-%%d-%%H-%%M); exec java -Xms512m -Xmx1024m ... -XX:HeapDumpPath=/u01/jetty/hdumps/hdump_$$ -verbose:gc ...
Beachten Sie noch einmal, dass Sie das $
mit dem $$
Kommando umgehen, daher glaubt systemd nicht, dass es sich um eine zu erweiternde systemd-Variable handelt. Wenn Sie exec
sicherstellen, dass die Shell durch den java
Prozess ersetzt wird, stellen Sie sicher, dass systemd die Haupt-PID des Services kennt.
Das Fluchen auf systemd ExecStart=
kann ziemlich schnell komplex und lästig werden. Ziehen Sie das Shellskript stattdessen in einer Datei ab (in diesem Fall müssen Sie sich nicht um das Fluchen kümmern $
und %
und wie die Anführungszeichen etwas anders funktionieren) das Skript aus dem ExecStart=
, ist viel einfacher (obwohl es eine zusätzliche Datei erfordert ...)