Ich versuche, ein systemd
zu erstellen Dienst;
Dieser Dienst hat ein Skript, das einige Umgebungsvariablen verwenden soll;
Also habe ich das erstellt:
cat /etc/systemd/system/atlantis-server.service
[Service]
ExecStart=/usr/local/bin/atlantis-server.sh
Was darauf hindeutet
[email protected]:~$ cat /usr/local/bin/atlantis-server.sh
#!/bin/bash
source /etc/environment
atlantis server --atlantis-url="$URL" --gitlab-user="$USERNAME" --gitlab-token="$TOKEN" --gitlab-webhook-secret="$SECRET" --gitlab-hostname="$HOSTNAME" --repo-whitelist="$REPO_WHITELIST"
Was mir aufgefallen ist (nach einigen Fehlern in meiner systemd
logs) ist, dass ich explizit source /etc/environment
musste
(Hier werden die obigen Variablen deklariert).
Warum wird das benötigt?
Sind sie nicht weltweit sichtbar?
bearbeiten :Das Hinzufügen zur Dienstdefinition hat das Problem nicht gelöst
Environment=/etc/environment
Akzeptierte Antwort:
/etc/environment
ist keine globale Konfigurationsdatei.
Es gilt nur unter Linux; nur zu PAM-Sitzungen, wie sie von login
verwendet werden und so weiter; und nur für den Fall, dass ein bestimmtes PAM-Plug-in auf dem System installiert und aktiviert ist und dieses PAM-Plug-in nicht für die Verwendung einer anderen Datei konfiguriert wurde (weil /etc/environment
ist lediglich seine Vorgabe, wenn ihm nichts anderes mitgeteilt wird). Es ist dieses PAM-Plug-in, das es liest.
Andernfalls ist es nur eine bedeutungslose Datei in /etc
das nichts nutzt.
Während Sie könnten Umgebungsvariablen global in systemd-system.conf
setzen , dies gilt für alle Dienste, nicht nur diejenigen, die Sie ändern möchten.
Ebenso während eine EnvironmentFile
in der/den entsprechenden Diensteinheit(en) eine Möglichkeit bietet, systemd eine gemeinsame Datei mit einer Liste von Umgebungsvariablendefinitionen lesen zu lassen, raten die Systemd-Leute von ihrer Verwendung ab. Sie betrachten EnvironmentFile
als schlechte Idee und ihre Verwendung als Fehler.
Der richtige Weg, dies gemäß den systemd-Leuten zu tun, besteht darin, jede Variable in der Service-Unit mit einer Environment
zu setzen -Einstellung, die den tatsächlichen Namen und Wert der Umgebungsvariablen enthält gesetzt werden, kein Dateiname. Das kann entweder direkt in der jeweiligen Service-Unit sein, wenn man wie hier eine eigene Service-Unit schreibt, die in /etc
platziert werden soll; oder in einer .conf
sein override-Datei, wenn man eine vorgefertigte Service-Unit in /lib
anpasst oder /usr/lib
.
Weiterführende Literatur
- https://unix.stackexchange.com/a/419061/5132
- Lennart Pöttering et al. (2016).
systemd-system.conf
. systemd Handbuchseiten. Freedesktop.org. - Lennart Pöttering et al. (2016).
systemd.exec
. systemd Handbuchseiten. Freedesktop.org. - Andrew G. Morgan und Thorsten Kukuk (August 2010). „pam_env – set/unset Umgebungsvariablen“. Das Handbuch für Linux-PAM-Systemadministratoren . linux-pam.org.