Umgebungsvariablen von der Befehlszeile in den Unit-Dateien festlegen

485
zozo6015

Ich versuche, ein Datum in der Einheitendatei für die Protokollierung festzulegen

Meine Unit-Datei sieht so aus:

[Unit] Description=Jetty service After=multiuser.target  [Service] Environment=MAIN_CLASS="com.candorgrc.nphase.MainJetty" Type=simple User=jetty Group=jetty WorkingDirectory=/home/jetty/dist PermissionsStartOnly=true ExecStartPre=/bin/systemctl set-environment date=$(/bin/date +%%Y-%%m-%%d-%%H-%%M) ExecStart=/usr/bin/java -Xms512m -Xmx1024m -Djava.util.logging.config.file=/home/jetty/logging.properties -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/u01/jetty/hdumps/hdump_$ -verbose:gc -Dcom.sun.management.jmxremote.port=12321 -Dcom.sun.management.jmxremote.authen PIDFile=/var/run/jetty.pid ExecReload=/bin/kill -HUP $MAINPID #Restart=on-failure ExecStop=/bin/kill -9 $MAINPID 

Das Einstellen des Datums scheint nicht zu funktionieren. Der Fehler, den ich erhalte, ist folgender:

Nov 26 16:47:50 vps203756 systemctl[14275]: Failed to set environment: Invalid environment assignments Nov 26 16:47:50 vps203756 systemd[1]: jetty.service: Control process exited, code=exited status=1 Nov 26 16:47:50 vps203756 systemd[1]: jetty.service: Failed with result 'exit-code'. Nov 26 16:47:50 vps203756 systemd[1]: Failed to start Jetty service. 

Irgendeine Idee, wie man es konfiguriert, damit es funktioniert?

2

1 Antwort auf die Frage

1
Filipe Brandenburger

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-environmentIhnen 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 execsicherstellen, dass die Shell durch den javaProzess 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 ...)