Der Universal Media Server ist praktisch um Musik oder Filme und Serien zum Beispiel über eine Playstation abspielen zu können. Besonders wenn man einen kleinen Server laufen hat. In dem Fall soll der UMS natürlich beim Systemstart ebenfalls starten. Leider hat der UMS manchmal aber auch seine macken, insbesondere leidet er an gelegentlichen Exceptions und lässt den Speicher voll laufen.
Installation als Service
Neuere Systeme, z. B. CentOS 7 oder die aktuelle LTS Ubuntu-Variante Yakkety Yak nutzen systemd
anstelle von init.d
zum Starten von Systemdiensten. Es gibt einige Ressentiments dagegen und viele Diskussionen. Es spielen sogar irgendwie Nazis rein
[…] he’s your typical German that’s into efficiency and control, and that’s the philosophy the software is built around. Doing everything as efficiently as possible with whatever is available. This doesn’t mesh too well with the (arguably very American) Linux philosophy of modularity and freedom of choice. [1]
Gemeint ist hier wohl Entwickler Lennart Poettering und sein Beitrag zur Klärung. Ein weiter deutscher Entwickler ist Kay Sievers, der durch seine Art scheinbar Stress mit Linus Torvalds hat, der mal wieder einen seiner epischen Rants abgelassen hat
Wie dem auch sei, man kann den UMS auch mit systemd
starten.
Zur Konfiguration des Media Servers als Service wird in der Datei
/etc/systemd/system/ums.service
die Konfiguration hinterlegt. UMS kommt bereits mit einem Startscript namens UMS.sh
, was als Startkommando ExecStart
hinterlegt wird. Wie es sich gehört, sollte der Media Server auch mit seinen eigenen Benutzerrechten laufen, in diesem Fall als Nutzer ums
.
Im bereich [Install]
wird angegeben, wann der Service gestartet werden soll, in diesem Fall also beim Systemstart vom Ziel multi-user
.
[Unit] Description=Universal Media Server [Service] Type=simple User=ums Group=ums ExecStart=/opt/UMS/UMS.sh [Install] WantedBy=multi-user.target
Nun muss der Service noch aktiviert werden.
systemctl enable ums.service
systemctl start ums.service
Neustart des Service
Eigentlich könnte es das schon gewesen sein. Leider stürzt der Server manchmal ab oder belegt zu viele Resourcen. Eine Möglichkeit das zu umgehen ist ein regelmäßiger Neustart.
Das kann man mit systemd
auch automatisieren, es ist ein cron
ähnlicher Scheduler enthalten (siehe feature creep ) Die Umsetzung ist aber etwas umständlich. Zunächst benötigt man einen eigenen Service
/etc/systemd/system/umsRestart.service
dessen Aufgabe darin besteht, den gerade definierten UMS Service neu zu starten. Er soll danach direkt beendet werden, und nicht wieterlaufen. Es ist daher eigentlich kein Service im eigentlichen Sinne. Dazu wird der Type
als oneshot
definiert. Um einen systemd
-Service neu zu starten kann der Befehl try-restart
genutzt werden.
[Unit] Description=Universal Media Server Restart Service [Service] Type=oneshot ExecStart=/bin/systemctl try-restart ums.service
Nun fehlt noch der Timer. Dazu wird ein dritter systemd
-Service benötigt, der diesmal ein anderer Typ ist und daher in der Datei
/etc/systemd/system/umsRestart.timer
mit der Endung .timer
spezifiziert wird. Die genaue Uhrzeit kann als Parameter OnCalendar
im 24-Stunden-Format angegeben werden, zum Beispiel nachts wenn normalerweise nichts läuft. Die verschiedenen Timer werden vom Target timer
verwaltet.
[Unit] Description=Universal Media Server Restart Timer [Timer] OnCalendar=4:45 Persistent=true [Install] WantedBy=timer.target
Damit nun alles läuft, muss die neuen Services noch gestartet werden:
systemctl daemon-reload systemctl start umsRestart.service
Testen
Eine Liste der aktuell laufenden Timer kann mit
systemctl list-timers
angezeigt werden. Wenn alles funktioniert hat ist der UMS Restart Service in der Liste enthalten:
NEXT LEFT LAST PASSED UNIT Di 2017-04-11 00:04:01 CEST 42min left Mo 2017-04-10 13:07:02 CEST 10h ago apt-daily.timer Di 2017-04-11 02:21:04 CEST 2h 59min left Mo 2017-04-10 19:32:02 CEST 3h 49min ago snapd.refresh.timer Di 2017-04-11 04:45:00 CEST 5h 23min left Mo 2017-04-10 04:45:02 CEST 18h ago umsRestart.timer Di 2017-04-11 22:33:35 CEST 23h left Mo 2017-04-10 22:33:35 CEST 47min ago systemd-tmpfiles-clean.timer 4 timers listed.
Wichtig ist, dass der Universal Media Service tatsächlich läuft. Ansonsten kann er nämlich nicht neu gestartet werden. Das kann man testen, indem der Restart-Service direkt ausgeführt wird. Es erscheint dann eine zugegebenermaßen nicht sehr verständliche Fehlermeldung:
$ systemctl status umsRestart.service ● umsRestart.service - Universal Media Server Restart Service Loaded: loaded (/etc/systemd/system/umsRestart.service; static; vendor preset: enabled) Active: failed (Result: exit-code) since Mo 2017-04-10 04:45:02 CEST; 18h ago Main PID: 28192 (code=exited, status=203/EXEC) Apr 10 04:45:02 k systemd[1]: Starting Universal Media Server Restart Service... Apr 10 04:45:02 k systemd[1]: umsRestart.service: Main process exited, code=exited, status=203/EXEC Apr 10 04:45:02 k systemd[1]: Failed to start Universal Media Server Restart Service. Apr 10 04:45:02 k systemd[1]: umsRestart.service: Unit entered failed state. Apr 10 04:45:02 k systemd[1]: umsRestart.service: Failed with result 'exit-code'.