Nutzerprozesse mit Systemd#
Systemd kann nützlich sein, um auf einem Serversystem als "normaler" User Prozesse ("Daemons") nach dem Booten des Servers zu starten und um diese Prozesse in eine eigene Resourcen-Gruppe zu verschieben.
Voraussetzung ist die Installation den Pakets libpam-systemd
apt-get install libpam-systemd
Zunächst muss das Feature für den User aktiviert werden
loginctl enable-linger <someuser>
Danach sollte unter der Kennung des Users someuser eine Instanz des Prozesses "/lib/systemd/systemd --user" laufen.
Ins Environment des Users muss die Umgebungsvariable
export XDG_RUNTIME_DIR="/run/user/$UID"
Eine Unit für den User kann in $HOME/.config/systemd/user/example.service angelegt werden. Dabei "example" durch den Namen des Service ersetzen. Im Folgenden nutze ich "tomcat".
Das Unit-File tomcat.service:
[Unit] Description=Tomcat User Service [Service] Type=simple WorkingDirectory=%h/tomcat Environment="PATH=/usr/local/bin:/usr/bin:/bin" Environment="JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" ExecStart=%h/tomcat/bin/catalina.sh run Restart=always PrivateTmp=true NoNewPrivileges=true [Install] WantedBy=default.target
Der Prozess sollte im Vordergrund laufen, das heisst sich nicht von der Shell lösen. Bei Tomcat lässt sich dies beispielsweise steuern, indem das Skript catalina.sh aufruft und den Startbefehl run verwendet (wie im Beispiel).
Wenn das nicht möglich ist, bietet SystemD der Service-Type forking:
[Service] Type=forking
Der Service wird aktiviert und gestartet mit:
systemctl --user enable tomcat.service systemctl --user start tomcat.service systemctl --user status tomcat.service systemctl --user stop tomcat.service
Nach Änderungen des Unit-File:
systemctl --user daemon-reload
Ressourcen limitieren#
Die Ressourcen können für jeden User einzeln begrenzt werden:
systemctl set-property user-1000.slice MemoryHigh=128M systemctl set-property user-1000.slice TasksMax=12 systemctl set-property user-1000.slice CPUQuota=33% systemctl cat user-1000.slice systemctl status user-1000.slice