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.exec
manpage:
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.
Erweitern Sie alle Ihre Variablen manuell. Das heißt, verwenden Sie
CATALINA_BASE=/d01/tomcat/prod/xyz/1
.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.service
gebe ich in nur die Environment
Variablen für CATALINA_BASE
und an CATALINA_HOME
und 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, EnvironmentFile
die sie verwenden kann:https://stackoverflow.com/a/42841480/32453
Die sekundäre Einheit kann beispielsweise Bash verwenden. Das scheint die systemd
Methode zum Importieren von Umgebungen zu sein. :|