Wie spezifiziere ich eine Environment systemd Direktive mit =?

20

Ich möchte eine Environment systemdDirektive angeben =, die z

Environment=CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

und erhalte den Fehler

[/lib/systemd/system/archiva.service:10] Invalid environment assignment, ignoring: CATALINA_OPTS=-Dappserver.home\=/var/lib/archiva/apache

in journalctl -xe. Ich habe versucht , mit zu zitieren "und 'und zu entkommen =mit \ohne Erfolg. Dies scheint undokumentiert.

Karl Richter
quelle

Antworten:

40

Ich denke, Ihr Problem ist auf den Platz im Inhalt der Umgebungsvariablen zurückzuführen. In den Beispielen aus den systemd-Dokumenten sollte eine Zuweisung eine einzelne Zeichenfolge sein:

Beispiel:

Environment="ONE=one" 'TWO=two two'
ExecStart=/bin/echo $ONE $TWO ${TWO}

Dies wird ausgeführt , / bin / echo mit vier Argumente: one, two, two, und two two.

Beispiel:

Environment=ONE='one' "TWO='two two' too" THREE=
ExecStart=/bin/echo ${ONE} ${TWO} ${THREE}
ExecStart=/bin/echo $ONE $TWO $THREE

Dies führt zu Echo wird zweimal, das erste Mal mit Argumenten aufgerufen 'one', 'two two' too, , und das zweite Mal mit Argumenten one, two two, too.

Ich habe dies mit folgendem Service getestet (Anführungszeichen rund um die gesamte Aufgabe beachten):

[Unit]
Description=My Daemon

[Service]
Environment='CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current'
ExecStart=/bin/echo ${CATALINA_OPTS}

[Install]
WantedBy=multi-user.target

Und bekam die gewünschte Ausgabe in journalctl:

Apr 26 08:19:29 laptop echo[28439]: -Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current

Es wäre natürlich einfacher, es EnvironmentFilestattdessen zu verwenden . Das Ersetzen Environmentdurch das Folgende ergab das gleiche gewünschte Ergebnis:

EnvironmentFile=/tmp/foo

Wo /tmp/fooenthalten (ohne Anführungszeichen):

CATALINA_OPTS=-Dappserver.home=/var/lib/archiva/apache-tomcat-current -Dappserver.base=/var/lib/archiva/apache-tomcat-current
muru
quelle
Wenn es darum geht, Zitate zu zitieren (z. B. durch Verwendung CATALINA_OPTSin einer systemdUmgebung für Apache tomcat7.0.61), EnvironmentFileist die Verwendung von wirklich der richtige Weg. Vielen Dank!
Karl Richter
Was ist das Standard- / Convention-Verzeichnis, um ein EnvironmentFile unter Ubuntu zu führen? Auf anderen Systemen habe ich / etc / sysconfig /
Davos
1
@Davos wäre ein vernünftiger Ort /etc/default. Dateien dort wurden in der Vergangenheit zum Platzieren von Umgebungsvariablen für entsprechende Init-Skripte verwendet.
Muru
Ich habe diese Datei bereits auf meinem System / etc / environment, die eine PATH-Variable enthält. Wäre es sinnvoll, daran anzuhängen?
Davos
1
@Davos das ist systemweit. Wenn es kein Problem gibt, wenn die Variable für praktisch jeden Prozess festgelegt wird, ist dies sicher. Beachten Sie, dass dies /etc/environmentnicht von einer Shell verarbeitet wird. Abgesehen von der einfachen Variablenzuweisung unterscheidet sich die Syntax stark von der oben angegebenen systemd-Syntax oder der allgemeinen Shell-Syntax.
muru