Umgebungsvariable
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Ubuntu 22.04 Jammy Jellyfish
Ubuntu 20.04 Focal Fossa
Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.
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.
das Verzeichnis /etc/systemd/system.conf.d und darin eine Datei wie z.B. 10-default-env.conf mit Umgebungsvariablen anlegen
das Editieren der Datei /etc/systemd/system.conf
ü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:
Mit der Direktive
Environment=
können ein oder mehrere Umgebungsvariablen gesetzt werden.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 Environment="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.
Links¶
Erklärung 🇬🇧 zu Umgebungsvariablen in der systemd Doku