systemd, EnvironmentFile, Variablen wiederverwenden – wie?

systemd, EnvironmentFile, Variablen wiederverwenden – wie?

Ich migriere vonEmporkömmlingZusystemd. Ich habe ein bisschen Probleme mit dem Übergang mit demUmgebungsdateiRichtlinie. Ich kann das nicht bekommenUmgebungsdateiarbeiten:

########################################################
# Catalina Settings
CLUSTER_BASE=/d01/tomcat/prod/xyz
CATALINA_BASE=$CLUSTER_BASE/1
CATALINA_TMPDIR=$CATALINA_BASE/temp
CATALINA_HOME=/usr/share/tomcat7
CATALINA_PID=/run/tomcat/tc-prod-xyz-1.pid

########################################################
# Java Settings
JAVA_HOME=/usr/lib/jvm/default-java/jre
JAVA_OPTS=-Djava.awt.headless=true
JAVA_OPTS=$JAVA_OPTS -server
JAVA_OPTS=$JAVA_OPTS -Xms2048m
JAVA_OPTS=$JAVA_OPTS -Xmx2048m
JAVA_OPTS=$JAVA_OPTS -XX:MaxPermSize=2048m
JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC
JAVA_OPTS=$JAVA_OPTS -XX:+AggressiveHeap
JAVA_OPTS=$JAVA_OPTS -javaagent:$CLUSTER_BASE/newrelic/newrelic.jar

Es scheint, dass diese Art von Anweisung, bei der ich eine Variable wiederverwende:

JAVA_OPTS=$JAVA_OPTS -XX:+UseParallelGC

wird nicht unterstützt insystemdals wäre es inEmporkömmling. Tutsystemdso etwas unterstützen oder muss ich eine lange, schwer lesbare Erklärung abgeben?

Antwort1

Leider handelt es sich bei der Datei, die Sie haben, eigentlich um ein Shell-Skript. In der Vergangenheit haben die meisten Init-Systeme/Skripte Dateien interpretiert, die Umgebungsvariablen mithilfe der Shell bereitstellen, sodass Sie Shell-Aufgaben darin ausführen konnten. Systemd tut dies jedoch nicht. Die Umgebungsdatei ist tatsächlich eine Umgebungsdatei und kein Skript. Dies ist dokumentiert in dersystemd.execmanpage:

Innerhalb der Zeichenfolgen wird keine Variablenerweiterung durchgeführt, eine Spezifizierererweiterung ist jedoch möglich. Das $-Zeichen hat keine besondere Bedeutung.

Daher haben Sie zwei Möglichkeiten.

  1. Erweitern Sie alle Ihre Variablen manuell. Das heißt, verwenden Sie CATALINA_BASE=/d01/tomcat/prod/xyz/1.

  2. Werten Sie die Datei mit der Shell aus:
    ExecStart=/bin/bash -ac '. /path/to/env_file; exec /path/to/program'

Antwort2

Muss ich eine lange, schwer lesbare Erklärung abgeben?

NEIN

Eine Zeile, die mit einem Backslash endet, wird mit der folgenden Zeile angehängt, wodurch mehrzeilige Variablendefinitionen möglich sind.

Antwort3

Im speziellen Fall von Tomcat (wie in dieser Frage) habe ich festgestellt, dass es einfacher ist, die meisten dieser Einstellungen in vorzunehmen bin/setenv.sh, das von Tomcat beim Start ausgeführt wird und die Variablen im Shell-Skript wie erwartet auswertet.

Also /etc/systemd/system/tomcat.servicegebe ich in nur die EnvironmentVariablen für CATALINA_BASEund an CATALINA_HOMEund gebe dann den Rest in ein ${CATALINA_BASE}/bin/setenv.sh.

Antwort4

Eine weitere Option: Lassen Sie eine sekundäre Einheit vor dieser laufen und eine erstellen, EnvironmentFiledie sie verwenden kann:https://stackoverflow.com/a/42841480/32453

Die sekundäre Einheit kann beispielsweise Bash verwenden. Das scheint die systemdMethode zum Importieren von Umgebungen zu sein. :|

verwandte Informationen