Zurück zur Startseite

Unit Files für die systemd User Instance

Systemd verwaltet verschiedene Typen von sogenannten Units. Die Service Unit ist die verbreitetste welche einen Service oder Daemon repräsentiert. Im Unit File ist die Konfiguration einer einzelnen Unit zusammengefasst. Im falle einer Service Unit wie der Daemon gestartet und gestoppt wird, wie festgestellt wir ob er läuft und was seine Abhängigkeiten sind.

In diesem Artikel zeigen wir einige Beispiele welche als Ausgangspunkt zum Schreiben von eigenen systemd Units dienen können. Für komplexere Anforderungen bieten wir ein paar Möglichkeiten wir die Units erweitert werden können.

Die Unit Files für die User Instanz werden üblicherweise in ~/.config/systemd/user gespeichert. Der Name der Datei definiert dabei den Namen und Typ der Unit. Die Datei ~/.config/systemd/user/myredis.service definiert eine Service Unit mit dem Namen myredis.

Die Unit Files sind in drei Teile unterteilt. Im Unit Abschnitt sind Metadaten über die Unit zu finden. Der zweite Abschnitt ist nach dem Unit Typ benannt, zum Beispiel Service. In diesem Abschnitt wird definiert was die Unit macht. Der Install Abschnitt einhält Informationen was gemacht werden soll beim aktivieren oder deaktivieren einer Unit.

Eine Anleitung wie man Units in der systemd User Instanz verwaltet ist in folgendem Artikel zu finden: Daemons als User mit systemd verwalten

Service Typen

Einfacher Service

Dieses beispiel startet einen Redis Server auf Port 7777. Der Unit Abschnitt definiert nur die Beschreibung und optional einen Hinweis auf die Dokumentation.
Im Service Abschnitt ist definiert mit welchen Befehlen der Service gestartet und gestoppt wird. Der Stop Befehl ist optional. Beim stoppen eines Services führt systemd erst diesen Befehl auf, falls vorhanden, und entfernt danach alle Übriggebliebenen Prozesse dieser Unit.

# ~/.config/systemd/user/myredis.service
[Unit]
Description=Custom Redis on Port 7777
Documentation=https://support.nine.ch/a/2xNbpLp-SpQ

[Service]
ExecStart=/usr/bin/redis-server --port 7777
ExecStop=/usr/bin/redis-cli -p 7777 shutdown

[Install]
WantedBy=default.target

Forking Service

Systemd empfiehlt services sich nicht selber zu daemonize. Falls ihre Anwendung dies dennoch mach, muss dies systemd mitgeteilt werden. Dies wird gemacht durch setzen des Types auf forking. Weiter ist es empfohlen in diesem Fall das PIDFile anzugeben mit welchem systemd den Hauptprozess ausfindig machen kann.

%him folgenden Beispiel wird durch den Pfad des Homedirectories des Users ersetzt und %p mit dem Namen der Unit. Mit solchen Platzhaltern können robustere und einfacher zu portierende Unit Files geschrieben werden. Weitere Informationen zu den Platzhaltern finden sie in der systemd.unit Man-Page.

# ~/.config/systemd/user/myredis.service
[Unit]
Description=Custom Redis on Port 7777
Documentation=https://support.nine.ch/a/2xNbpLp-SpQ

[Service]
Type=forking
ExecStart=/usr/bin/redis-server --port 7777 --daemonize yes --pidfile %h/.%p.pid
ExecStop=/usr/bin/redis-cli -p 7777 shutdown
PIDFile=%h/.%p.pid

[Install]
WantedBy=default.target

Service Vorlagen

Vorlagen (Templates) sind ein mächtiges Werkzeug von systemd. Units mit einem Namen welcher auf @ endet werden von systemd als Vorlage behandelt. Dies ermöglicht das starten von mehreren ähnlichen Instanzen des selben Services. Wenn Sie folgendes Beispiel in eine Datei namens myredis@.service speichern, können sie die Units myredis@7777 und myredis@7778 starten um zwei Redis Server auf Port 7777 und 7778 zu starten. Der Teil hinter dem @ wird dabei für den Platzhalter %i in die Vorlage eingefüllt.

# ~/.config/systemd/user/myredis@.service
[Unit]
Description=Custom Redis on Port %i
Documentation=https://support.nine.ch/a/2xNbpLp-SpQ

[Service]
ExecStart=/usr/bin/redis-server --port %i
ExecStop=/usr/bin/redis-cli -p %i shutdown

[Install]
WantedBy=default.target

Erweiterte Konfigurations Schnipsel

Hooks

Wenn gewisse zusätzliche Befehle vor dem starten oder nach dem stoppen ausgeführt werden soll, kann dies mit den Pre/Post Start/Stop Befeheln gemacht werden. Diese Parameter können mehrmals angegeben werden um mehrere befehle auszuführen. Wenn einem Befehl ein - vorangestellt wird ignoriert systemd ob der Befehl erfolgreich war oder nicht. Ohne dies für ein Fehler im Pre-Start zum Abbruch des Services und der Daemon wird gar nicht gestartet.

[Service]
ExecStartPre=/bin/mkdir -p /tmp/mytempdir
ExecStartPre=-/bin/false
ExecStartPost=/usr/bin/touch /tmp/mytempdir/started
ExecStopPost=/bin/rm -rf /tmp/mytempdir

Neuladen

Falls ihr Anwendung es ermöglicht ohne Neustart die Konfiguration neu zu lesen kann dies systemd mirt dem ExecReload Parameter mitgeteilt werden. Systemd führt für den Reload den angegebenen Befehlt aus, wobei die PID des Hauptprozesses für den Platzhalter $MAINPID eingesetzt wird.

[Service]
ExecReload=/bin/kill -HUP $MAINPID

Neustarten

Durch den Restart Parameter lässt sich steuern wie systemd auf ein unerwartetes beenden des Services reagiert. ie Standardeinstellung ist no, durch setzen auf always versucht systemd in solch einem Fall den Service automatisch neu zu starten.

[Service]
Restart=always

Environment Variabel Setzen

Gewisse Anwendungen lassen sich durch das setzen von Environment Variabel steuern. Systemd ermöglich es auf einfache Weise das Arbeitsverzeichnis und Environment Variabeln zu setzen.

Die Datei welche mit EnvironmentFile angegeben wir kann Variablen die mit Environment gesetzt wurden überschreiben. Die Datei muss existieren, ausser dem Dateipfad wurde ein - Vorangestellt. In diesem Fall ignoriert systemd nicht existierende Dateien. Im EnvironmentFile werden Zeilen im Format NAME=WERT erwartet.

[Service]
WorkingDirectory=/home/www-data/servicedir
Environment=ENV=production
EnvironmentFile=-/home/www-data/servicedir/.env

Links

Mehr Informationen zu den Unit Files kann in der systemd.unit Man-Page gefunden werden. Für Service Units sind auch die systemd.service und systemd.exec Man-Pages zu empfehlen.

Haben Sie die gewünschten Informationen nicht gefunden?

Kontaktieren Sie unseren Support:

+41 44 637 40 40 support@nine.ch