ubuntuusers.de

Umgebungsvariable

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

systemd kennt eigene Umgebungsvariablen, welche entweder systemweit für alle von systemd gestarteten Prozesse verfügbar sind oder nur für eine von systemd ausgeführte Unit.

Syntax der systemd Umgebungsvariablen

Alle Umgebungsvariablen von systemd - egal ob systemweit oder nur für eine Unit - werden in der Form von Schlüssel-Werte Paaren angegeben.

So würde bei Foo=Bar die Umgebungsvariable Foo den Wert Bar haben. Ein einzelnes Schlüssel-Werte Paar muss nicht in Anführungszeichen gesetzt werden, wenn der Wert kein Leerzeichen enthält. Anführungszeichen sind aber Pflicht, wenn der Wert ein Leerzeichen enthält, wie z.B. "Gruss=Hallo Welt" .

systemweite Umgebungsvariablen anzeigen

Die systemweiten Umgebungsvariablen lassen sich über systemctl anzeigen:

systemctl show --property Environment 

systemweite Umgebungsvariablen setzen

Zum Setzen von systemweiten Umgebungsvariablen gibt es drei Möglichkeiten.

  1. das Verzeichnis /etc/systemd/system.conf.d und darin eine Datei wie z.B. 10-default-env.conf mit Umgebungsvariablen anlegen

  2. das Editieren der Datei /etc/systemd/system.conf

  3. über eine Bootoption

Verzeichnis system.conf.d

Alternativ kann zum Editieren von system.conf kann auch in /etc/systemd mit Root-Rechten das Verzeichnis system.conf.d angelegt werden und darin eine Datei wie z.B. 10-default-env.conf. In dieser Datei fügt man eine Sektion [Manager] ein, dann eine Zeile beginnend mit DefaultEnvironment= ein, wo man dann wie in der Datei systemd.conf ein oder mehrere Schlüssel-Werte Paare hinterlegen kann:

[Manager]
DefaultEnvironment=Foo=Bar Spam=Egg

Die Notation mit mehreren Gleichheitszeichen sieht zwar komisch aus, ist aber so korrekt.

Der Name der Datei muss nicht 10-default-env.conf lauten, er kann beliebig gewählt werden. Die Endung muss aber .conf sein. Gibt es im Verzeichnis mehrere .conf Dateien, werden diese nach ihrem Namen in lexikalischer Reihenfolge abgearbeitet.

Datei systemd.conf

In der Datei /etc/systemd/system.conf gibt es in der Sektion [Manager] eine Zeile DefaultEnvironment=, welche standardmäßig mit dem Rautezeichen # auskommentiert ist. Hier kann man systemweite Umgebungsvariablen hinzufügen. Dazu öffnet man die Datei mit einem Editor mit Root-Rechten[2][3], entfernt das Rautezeichen und fügt ein oder mehrere Schlüssel-Werte Paare hinzu, also z.B.

DefaultEnvironment=Foo=bar

Bei einem Update von systemd könnte es vorkommen, dass die Datei system.conf überschrieben wird, von daher ist der weiter oben beschriebene Weg über ein eigenes Verzeichnis mit einer .conf Datei der bevorzugte Weg.

Bootoption

Fügt man die Option systemd.setenv=SCHLUESSEL=WERT in der Kernel-Kommandozeile hinzu, wird die systemd Umgebungsvariable SCHLUESSEL systemweit auf WERT gesetzt. Benötigt man mehrere Umgebungsvariablen, kann die Option mehrfach angegeben werden.

Umgebungsvariablen für eine Unit setzen

Benötigt man ein oder mehrere Umgebungsvariablen nur für eine Unit, dann lässt sich das über zwei alternative Direktiven realisieren:

  1. Mit der Direktive Environment= können ein oder mehrere Umgebungsvariablen gesetzt werden.

  2. Mit der Direktive EnvironmentFile= kann angegeben werden, in welcher Datei die Umgebungsvariablen hinterlegt sind.

Allerdings sind diese Direktiven nicht in allen Unit-Typen zulässig, sondern nur in Service-, Mount-, Socket- und Swap-Units.

Die in Units gesetzten Umgebungsvariablen sind nur innerhalb der Prozesse verfügbar, die von der Unit gestartet werden, also auch deren Kindprozesse. In anderen Prozessen, die von anderen Units und vom Nutzer gestartet wurden, sind diese Umgebungsvariablen nicht sichtbar.

Environment Direktive

Innerhalb der für die Unit spezifischen Sektion, wie z.B. die Sektion [Service] bei Service-Units, kann die Direktive Environment= eingefügt werden, gefolgt von ein oder mehreren Umgebungsvariablen:

Beispiel:

...
[Service]
...
Environment=Foo=Bar "Gruss=Hallo Welt"
...

Die Direktive kann auch mehrfach angeben werden. Das folgende Beispiel ist äquivalent zum vorherigen:

...
[Service]
...
Environment=Foo=Bar
Environmet="Gruss=Hallo Welt"
...

EnvironmentFile Direktive

Alternativ kann man Umgebungsvariablen für die Unit auch in einer separaten Datei angegeben werden. Der Name kann beliebig gewählt werden, ebenso der Speicherort. Die Datei muss lediglich lesbar sein.

In der Datei werden die Umgebungsvariablen zeilenweise hinterlegt, wie z.B.:

Foo=Bar
"Gruss=Hallo Welt"

In der Unit wird diese Datei dann über die Direktive EnvironmentFile= eingebunden:

...
[Service]
...
EnvironmentFile=/home/BENUTZER/conf/meine_variablen.conf
...

Hier wird aus dem Verzeichnis /home/BENUTZER/conf/ die Datei meine_variablen.conf gelesen, welche die zu setzenden Umgebungsvariablen enthält.

Umgebungsvariablen in systemd-Containern

Wird über systemd eine Containerumgebung über https://www.freedesktop.org/software/systemd/man/systemd-nspawn.html 🇬🇧 angelegt, wird in den Units, die im Container gestartet werden, zusätzlich die Direktive PassEnvironment= benötigt, damit die Units auf Umgebgungvariablen zugreifen können.

Wenn man z.B. einen Container mit systemd-nspawn mit dem Argument --setenv=Foo=Bar startet, kann man auf die Umgebungsvariable Foo in einer Unit im Container nur zugreifen, wenn man die Direktive PassEnvironment=Foo in der entsprechenden Unit verwendet.

Umgebungsvariablen in Units ansprechen

Der Zugriff auf Umgebungsvariablen von systemd erfolgt für Skripte auf dem üblichen Weg. So würde die Service Unit

...
[Service]
Environment="Gruss=Hallo Welt"
ExecStart=/bin/bash /home/NUTZER/mein_skript.sh
...

mit mein_skript.sh

1
echo ${Gruss}

Hallo Welt" als Ausgabe haben.

Umgebungsvariablen können auch direkt in der Unit genutzt werden, der Aufruf erfolgt mit einem Bash-ähnlichen Syntax:

...
[Service]
...
Environment=PORT=8080
ExecStart=/home/BENUTZER/code/start_server.py -p ${PORT}
...

Hier würde dem Skript start_server.py der Wert 8080 für die Option -p mitgegeben.

  • Erklärung 🇬🇧 zu Umgebungsvariablen in der systemd Doku

Diese Revision wurde am 1. April 2018 20:48 von noisefloor erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: systemd, System, Shell