Zurück zur Startseite

Daemons als User mit systemd verwalten

Ubuntu setzt ab Xenial auf systemd als init system. Zusätzlich zur globalen Instanz kennt systemd auch per-user Instanzen. Dadurch ist es möglich als User eigene Daemons zu betreiben und zu kontrollieren.

Systemd kennt eine ganze Anzahl an unterschiedlichen Typen von Units die er verwalten kann. Die meist gebrauchte ist die service Unit welche einen Service oder Daemon darstellt.

In diesem Artikel erläutern wir wie man mit systemd interagiert und Services verwaltet. Mehr Informationen zum erstellen von Unit Files sind in folgendem Artikel zu finden: Unit Files für die systemd User Instance

Für die Interaktion mit der per-user inszanz wird systemctl --user verwendet. Ohne --user verbindet sich systemctl read-only mit der globalen Instanz. Die Konfiguration der Units für per-user systemd findet sich in ~/.config/systemd/user.

Systemd bringt einige neue Ansätze mit. Daemons sollen sich möglichst nicht selber daemonizen, sondern im Vordergrund weiterlaufen Systemd fällt es dadurch leichter den Prozess zu überwachen. Logs können dabei direkt nach STDOUT/STDERR geschrieben werden, systemd reicht diese dann ans journal weiter.

Erster obligatorischer Schritt

“Failed to connect to bus: No such file or directory” Error

Wenn Sie diesen Fehler sehen, kontaktieren Sie bitte support@nine.ch. Wir werden den Dienst dann für Sie starten. Dies ist nur beim allerersten mal erforderlich. Da wir die Passwortänderung beim ersten anmelden erzwingen, hat dies leider den Nebeneffekt, dass der Dienst nicht automatisch gestartet werden kann. (pam-restriction)

User Systemd Status

Mit dem Befehl systemctl --user status kann man anzeigen lassen was alles unter dem eigenen systemd läuft. In folgendem Beispiel ist neben der per-user systemd Instanz (init.scope) auch ein eigener Redis Server im myredis.service.

www-data@server:~ $ export XDG_RUNTIME_DIR=/run/user/$UID
www-data@server:~ $ systemctl --user status
● server
    State: running
     Jobs: 0 queued
   Failed: 0 units
    Since: <DATUM>
   CGroup: /user.slice/user-33.slice/user@33.service
           ├─myredis.service
           │ └─2935 /usr/bin/redis-server *:7777     
           └─init.scope
             ├─2930 /lib/systemd/systemd --user
             └─2932 (sd-pam)  

Status eines Services

Es ist auch möglich den Status eines einzelen Services abzufragen. Dabei wird neben dem Status auch eine Liste der laufenden Prozesse und die letzten Zeilen von STDOUT angezeigt.

www-data@server:~ $ systemctl --user status myredis.service
● myredis.service - User Redis on port 7777
   Loaded: loaded (/home/www-data/.config/systemd/user/myredis.service; enabled; vendor preset: enabled)
   Active: active (running) since <DATUM>
  Process: 6701 ExecStop=/usr/bin/redis-cli -p 7777 shutdown (code=exited, status=0/SUCCESS)
 Main PID: 6851 (redis-server)
   CGroup: /user.slice/user-33.slice/user@33.service/myredis.service
           └─6851 /usr/bin/redis-server *:7777     

<DATUM> server redis-server[6851]:  |`-._`-._    `-.__.-'    _.-'_.-'|
<DATUM> server redis-server[6851]:  |    `-._`-._        _.-'_.-'    |
<DATUM> server redis-server[6851]:   `-._    `-._`-.__.-'_.-'    _.-'
<DATUM> server redis-server[6851]:       `-._    `-.__.-'    _.-'
<DATUM> server redis-server[6851]:           `-._        _.-'
<DATUM> server redis-server[6851]:               `-.__.-'
...

Logs/Journal eines Services einsehen

Das journal wird mit journalctl angeschaut. Dabei kann gezielt nach einzelnen services gefiltert werden.

www-data@xenial1-dev:~ $ journalctl --user-unit=myredis.service
...
<DATUM> server redis-server[6851]:  |`-._`-._    `-.__.-'    _.-'_.-'|
<DATUM> server redis-server[6851]:  |    `-._`-._        _.-'_.-'    |
<DATUM> server redis-server[6851]:   `-._    `-._`-.__.-'_.-'    _.-'
<DATUM> server redis-server[6851]:       `-._    `-.__.-'    _.-'
<DATUM> server redis-server[6851]:           `-._        _.-'
<DATUM> server redis-server[6851]:               `-.__.-'
<DATUM> server redis-server[6851]: 6851:M <DATUM> # Server started, Redis version 3.0.6
<DATUM> server redis-server[6851]: 6851:M <DATUM> * The server is now ready to accept connections on port 7777

Service aktivieren

Um einen Service beim booten zu starten muss er im default.targetaktiviert werden. Das meist verwendete multi-user.target ist in der systemd User Instanz nicht vorhanden. Die folgenden Beispiele Zeigen wie ein Service aktiviert und deaktiviert werden kann.

www-data@server:~ $ systemctl --user enable myredis.service 
Created symlink from /home/www-data/.config/systemd/user/default.target.wants/myredis.service to /home/www-data/.config/systemd/user/myredis.service.
www-data@server:~ $ systemctl --user disable myredis.service 
Removed symlink /home/www-data/.config/systemd/user/default.target.wants/myredis.service.

Mit systemctl --user is-enabled kann überprüft werden ob ein Service aktiviert ist.

www-data@xenial1-dev:~ $ systemctl --user is-enabled myredis.service 
enabled

Haben Sie die gewünschten Informationen nicht gefunden?

Kontaktieren Sie unseren Support:

+41 44 637 40 40 support@nine.ch