systemd Service File

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
oln
Beiträge: 487
Registriert: 05.01.2021 09:41:24

systemd Service File

Beitrag von oln » 22.08.2023 11:38:39

Hallo Forum,
ich habe ein Service File Template erstellt und möchte dort den Parameter für einen Pfad nutzen. Leider bekomme ich immer folgenden Fehler:

Code: Alles auswählen

 systemd[1]: /etc/systemd/system/testenv@.service:7: EnvironmentFile= path is not absolute, ignoring: "/etc/systemd/system/testconf"

Mein Service-Script:

Code: Alles auswählen

$ cat /etc/systemd/system/testenv@.service
[Unit]
Description=Test Environmnent Variables %I

[Service]
Type=simple
EnvironmentFile="/etc/systemd/system/%i" (ignore_errors=no)
ExecStart=/usr/bin/test_env_service
Restart=on-failure

[Install]
WantedBy=default.target
Da ich mehrere Instanzen mit unterschiedlichen Variablen starten möchte, kam mir die Idee das über ein jeweiliges EnvironmentFile zu lösen.
Gibt es da andere Möglichkeiten oder einen Weg das EnvironmentFile zu dynamisieren?
Gruß Ole
AbuseIPDB

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: systemd Service File

Beitrag von JTH » 22.08.2023 12:34:41

Hast du einen konkreten Grund, warum du den Wert für EnvironmentFile gequotet hast? Ohne die Quotes hat das, schnell in ner VM ausprobiert, funktioniert. Ich vermute, die Quotes sind an dieser Stelle einfach nicht erlaubt/erwartet und werden als Teil des Pfads gelesen.
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
oln
Beiträge: 487
Registriert: 05.01.2021 09:41:24

Re: systemd Service File

Beitrag von oln » 22.08.2023 13:22:35

Selbst wenn ich die Quotes weg nehme, bekomme ich "testenv@testconf.service: Failed to load environment files: No such file or directory".
Gruß Ole
AbuseIPDB

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: systemd Service File

Beitrag von JTH » 22.08.2023 13:28:30

Dann ganz blöd gefragt: Existiert die Datei /etc/systemd/system/testconf denn (schon)?

Wenn sie nicht unbedingt existieren soll, könntest du den Pfad mit - prefixen:

Code: Alles auswählen

EnvironmentFile=-/etc/systemd/system/%i
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
oln
Beiträge: 487
Registriert: 05.01.2021 09:41:24

Re: systemd Service File

Beitrag von oln » 22.08.2023 13:59:26

Ja das die existiert.
Keine Ahnung was ich jetzt geänder habe, aber nun geht es.
Leider habe ich das nächste Problem. Im testconfig habe ich eine Variable angelegt für

Code: Alles auswählen

WorkingDirectory=-${WORKDIR}
.
in der testconfig sieht das so aus:

Code: Alles auswählen

[root@srv system]# cat testconfig
WORKDIR=/var/www/projects/test/
Nun bekomme ich den Fehler auch dort:

Code: Alles auswählen

2023-08-22T13:53:18.965952+02:00 srv systemd[1]: /etc/systemd/system/testenv@.service:7: WorkingDirectory= path is not absolute: ${WORKDIR}
2023-08-22T13:53:18.966222+02:00 srv systemd[1]: testenv@testconfig.service: Unit configuration has fatal error, unit will not be started.
Gruß Ole
AbuseIPDB

Benutzeravatar
oln
Beiträge: 487
Registriert: 05.01.2021 09:41:24

Re: systemd Service File

Beitrag von oln » 22.08.2023 14:28:47

So nun habe ich raus bekommen, dass meine Variable aus dem Env-File nicht ankommt. Was mache ich falsch?
Gruß Ole
AbuseIPDB

JTH
Moderator
Beiträge: 3023
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: systemd Service File

Beitrag von JTH » 22.08.2023 14:33:21

oln hat geschrieben: ↑ zum Beitrag ↑
22.08.2023 13:59:26
Keine Ahnung was ich jetzt geänder habe, aber nun geht es.
Vielleicht noch ein systemctl daemon-reload dazwischen geschoben? ;)
oln hat geschrieben: ↑ zum Beitrag ↑
22.08.2023 13:59:26
Ja das die existiert.
… oder es war ein Tippfehler, du schriebst oben einmal von testconf und dann von testconfig. Die Datei in /etc und der instanziierte Service müssen natürlich den gleichen Namen benutzen.


oln hat geschrieben: ↑ zum Beitrag ↑
22.08.2023 13:59:26
Leider habe ich das nächste Problem. Im testconfig habe ich eine Variable angelegt für

Code: Alles auswählen

WorkingDirectory=-${WORKDIR}
.
Ich bin mir zugegebenermaßen nicht 100% sicher, aber ich meine: Das geht schlicht nicht, ist so nicht vorgesehen. Die Umgebungsvariablen, die per Environment= oder EnvironmentFile= gesetzt werden, können höchstens in ExecStart= und verwandten Exec-Zeilen referenziert werden. Und werden natürlich, als Hauptzweck, an den ausgeführten Dienst weitergegeben.

Was du stattdessen machen kannst, um trotzdem Teile der Instanzen der Template-Unit testenv@.service unterschiedlich zu konfigurieren: Benutze eine Drop-in-.conf pro Instanz (siehe man systemd.unit zu „drop-in“):

Code: Alles auswählen

mkdir -p /etc/systemd/system/testenv@testconfig.service.d
printf '[Service]\nWorkingDirectory=/var/www/projects/test\n' >/etc/systemd/system/testenv@testconfig.service.d/workdir.conf
Manchmal bekannt als Just (another) Terminal Hacker.

Antworten