Die Zeiten ändern sich und bewährte Methoden auch.
Der derzeit beste Weg, dies zu tun, ist das Ausführen systemctl edit myservice
, wodurch eine Überschreibungsdatei für Sie erstellt wird oder Sie eine vorhandene bearbeiten können.
Bei normalen Installationen wird ein Verzeichnis erstellt /etc/systemd/system/myservice.service.d
, und in diesem Verzeichnis wird eine Datei erstellt, deren Name .conf
(normalerweise override.conf
) auf endet. In dieser Datei können Sie einen beliebigen Teil der von der Distribution gelieferten Einheit hinzufügen oder überschreiben.
Zum Beispiel in einer Datei /etc/systemd/system/myservice.service.d/myenv.conf
:
[Service]
Environment="SECRET=pGNqduRFkB4K9C2vijOmUDa2kPtUhArN"
Environment="ANOTHER_SECRET=JP8YLOc2bsNlrGuD6LVTq7L36obpjzxd"
Beachten Sie auch, dass Ihr Dienst deaktiviert wird, wenn das Verzeichnis existiert und leer ist! Wenn Sie nicht beabsichtigen, etwas in das Verzeichnis aufzunehmen, stellen Sie sicher, dass es nicht vorhanden ist.
Als Referenz war der alte Weg:
Der empfohlene Weg , dies zu tun, besteht darin, eine Datei zu erstellen, /etc/sysconfig/myservice
die Ihre Variablen enthält, und sie dann mit zu laden EnvironmentFile
.
Ausführliche Informationen finden Sie in der Fedora-Dokumentation zum Schreiben eines systemd-Skripts .
sysconfig
Pfad ist spezifisch für Fedora, aber die Frage betrifft Arch Linux. Die Antwort von paluh ist interessanter, denke ich/etc/sysconfig
ist Fedora-spezifisch. AFAIR Arch Linux drängte darauf, die Konfigurationsdateien an einem paketspezifischen Ort anstatt an/etc
diesem Fedora-spezifischen Ort zu haben. Wie/etc/myservice.conf
, wenn zusätzliche Datei hier scheint nicht den richtigen Weg.DJANGO_SETTINGS_MODULE=project.settings
eines pro Zeile.Die Antwort hängt davon ab, ob die Variable konstant sein soll (dh nicht vom Benutzer geändert werden soll, der die Einheit erhält) oder variabel (vom Benutzer festgelegt werden soll).
Da es sich um Ihre örtliche Einheit handelt, ist die Grenze ziemlich verschwommen und in beiden Fällen funktioniert es. Wenn Sie jedoch anfangen würden, es zu verbreiten, und es würde in enden
/usr/lib/systemd/system
, würde dies wichtig werden.Konstanter Wert
Wenn sich der Wert nicht pro Instanz ändern muss, ist die bevorzugte Methode
Environment=
, ihn direkt in der Unit-Datei zu platzieren:Dies hat den Vorteil, dass die Variable mit der Einheit in einer einzigen Datei gespeichert wird. Daher ist es einfacher, die Unit-Datei zwischen den Systemen zu verschieben.
Variabler Wert
Die obige Lösung funktioniert jedoch nicht gut, wenn sysadmin den Wert der Umgebungsvariablen lokal ändern soll. Insbesondere müsste der neue Wert jedes Mal festgelegt werden, wenn die Einheitendatei aktualisiert wird.
In diesem Fall ist eine zusätzliche Datei zu verwenden. Wie - hängt in der Regel von der Distributionsrichtlinie ab.
Eine besonders interessante Lösung ist die Verwendung eines
/etc/systemd/system/myservice.service.d
Verzeichnisses. Im Gegensatz zu anderen Lösungen wird dieses Verzeichnis von systemd selbst unterstützt und enthält daher keine verteilungsspezifischen Pfade.In diesem Fall platzieren Sie eine Datei wie
/etc/systemd/system/myservice.service.d/local.conf
diese und fügen die fehlenden Teile der Unit-Datei hinzu:Danach führt systemd die beiden Dateien beim Starten des Dienstes zusammen (denken Sie daran,
systemctl daemon-reload
nachdem Sie eine der beiden Dateien geändert haben). Und da dieser Pfad direkt von systemd verwendet wird, verwenden Sie dies nichtEnvironmentFile=
.Wenn der Wert nur auf einigen der betroffenen Systeme geändert werden soll, können Sie beide Lösungen kombinieren, indem Sie eine Standardeinstellung direkt in der Einheit und eine lokale Überschreibung in der anderen Datei festlegen.
quelle
systemctl daemon-reload
ist der Befehl zum Nachladen von systemdEnvironmentFile=
ist besser, wenn die Werte Geheimnisse wie Passwörter sind. Siehe meine Antwort für Details.http://0pointer.de/public/systemd-man/systemd.exec.html#Environment= - Sie haben zwei Möglichkeiten (eine, auf die Michael bereits hingewiesen hat):
und
quelle
Die Antworten von Michael und Michał sind hilfreich und beantworten die ursprüngliche Frage, wie eine Umgebungsvariable für einen systemd-Dienst festgelegt wird. Eine häufige Verwendung von Umgebungsvariablen besteht jedoch darin, vertrauliche Daten wie Kennwörter an einem Ort zu konfigurieren, an dem sie nicht versehentlich mit dem Code Ihrer Anwendung zur Quellcodeverwaltung verpflichtet werden.
Wenn das ist , warum Sie eine Umgebungsvariable zu Ihrem Dienst übergeben mögen, nicht verwendet
Environment=
in der Einheit - Konfigurationsdatei. VerwendenEnvironmentFile=
Sie eine andere Konfigurationsdatei, die nur vom Dienstkonto (und von Benutzern mit Root-Zugriff) gelesen werden kann, und verweisen Sie darauf.Die Details der Einheitenkonfigurationsdatei sind für jeden Benutzer mit diesem Befehl sichtbar:
Ich habe eine Konfigurationsdatei bei
/etc/my_service/my_service.conf
und meine Geheimnisse dort abgelegt:Dann habe ich in meiner Service Unit-Datei Folgendes verwendet
EnvironmentFile=
:Ich habe überprüft, dass
ps auxe
diese Umgebungsvariablen nicht angezeigt werden und andere Benutzer keinen Zugriff darauf haben/proc/*/environ
. Überprüfen Sie dies natürlich auf Ihrem eigenen System.quelle
Michael gab eine saubere Lösung, aber ich wollte eine aktualisierte env-Variable aus dem Skript erhalten. Leider ist die Ausführung von bash-Befehlen in der systemd-Unit-Datei nicht möglich. Glücklicherweise können Sie Bash in ExecStart auslösen:
http://www.dsm.fordham.edu/cgi-bin/man-cgi.pl?topic=systemd.service§=5
Beispiel in unserem Fall ist dann:
quelle
/bin/bash -a -c 'source /etc/sysconfig/whatever && exec whatever-program'
. Die-a
gewährleistet wird die Umgebung auf den Teilprozess ausgeführt (es sei denn , Sie alle Variablen in Präfix wollenwhatever
mitexport
)ExecStart=/usr/bin/env ENV=script /bin/myforegroundcmd
ist eine etwas bessere Lösung in diesem Fall.