• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Subsonic mit Systemd starten

DerArne

Member
Hallo zusammen,
hier eine kurze Anleitung um Subsonic unter Systemd zu installieren.

Kurz: Wer oder was ist Subsonic?
Wer einen Server betreibt und dort seine Musik hat, oder wem ein lokal installierter Player (z.B. Amarok oder Rythembox) zu schwerfällig ist, wer also über das heimische Netz seine Musik hören will, dem empfehle ich, sich mal Subsonic anzuschauen.
Leider gibt es von diesem Projekt kein rpm für OpenSuSE so das man sich für diese Plattform das Projekt von den Projektseiten runterladen und selber installieren muss. (-> http://www.subsonic.org. Für die nun folgende Installationsanleitung habe ich die generelle "Stand-alone version (all platforms)" Version heruntergeladen. Das ist ein tar.gz-Archiv.
Subsonic ist in Java realisiert, und läuft gut mit dem OpenJDK 7, so dass man hier das passende rpm im yast nehmen kann (-> http://software.opensuse.org/package/java-1_7_0-openjdk)
Die nun folgenden Schritte kann man erstmal als root ausführen, später machen wir das dann richtig.
Nun den Tar-Ball auspacken. Ich habe dazu den Ordner /opt/subsonic angelegt. Und das Tar-Ball dort entpackt. Achtung: Das tar-Ball ist etwas lieblos zusammengestellt und packt sich nicht in einem eigenen Ordner aus. :igitt:

Jetzt die subsonic.sh anpassen:
Code:
SUBSONIC_HOME=/opt/subsonic
SUBSONIC_HOST=192.168.7.20
SUBSONIC_PORT=4040
SUBSONIC_HTTPS_PORT=0
SUBSONIC_CONTEXT_PATH=/
SUBSONIC_MAX_MEMORY=150
SUBSONIC_DEFAULT_MUSIC_FOLDER=/data/Musik
SUBSONIC_DEFAULT_PODCAST_FOLDER=/data/Musik
SUBSONIC_DEFAULT_PLAYLIST_FOLDER=/data/Musik
Klar, SUBSONIC_HOST gibt die IP des externen Interfaces an. Der Rest ist denke ich selbst erklärend.
Mit einem /opt/subsonic/subsonic.sh kann man nun testen ob alles startet.
In /opt/subsonic/subsonic.log kann man den Server starten und eventuelle Probleme berichten sehen. Läuft alles glatt, kann man unter der Server IP auf Port 4040 mit Subsonic rumspielen.

Alles gut? Oder?
Was ist an dieser so, vom Author von Subsonic vorgesehen Art den Dienst zu starten nun zu kritisieren?
Nun, eigentlich sollte so ein Dienst auf dem Server beim Hochfahren automatisch starten. Diese Installation will aber immer von Hand gestartet werden. Das ist schon alles. ;)
Hier kommt nun systemd ins Spiel und gleichzeitig sichern wir das alles, indem wir den Dienst nicht mehr als root starten...
Dafür legen wir einen neuen Benutzer an, ich habe ihn "subsonic" genannt und geben ihm /opt/subsonic als Home-Verzeichnis. Yast bietet dabei praktischer Weise an, den Eigentümer des Home-Verzeichnises dem neuen User zu geben. Dem stimmen wir zu. Wer das außerhalb vom Yast macht, sollte daran denken, mittel chown -R subsonic /opt/subsonic die Rechte von Hand zu setzen.
Jetzt ist alles vorbereitet um systemd unseren neuen Dienst vor zu stellen. Dazu legen wir eine kleine Datei namens /etc/systemd/system/subsonic.service mit folgendem Inhalt an:
Code:
[Unit]
Description=Subsonic Sound-Server

[Service]
User=subsonic
WorkingDirectory=/opt/subsonic
ExecStart=/opt/subsonic/subsonic.sh 
Restart=on-abort

[Install]
WantedBy=multi-user.target
Wie man hier sieht, wollen wir das mitgelieferte Script subsonic.sh verwenden, das dafür nicht vorgesehen ist. Das eigentlich wirkliche Problem an dem Script ist nur, das der Java-Prozess in einem eigenen Thread gestartet wird. Nach dem Start beendet sich das Script also sofort wieder und der Java Prozess läuft im Hintergrund als Deamon. Was für das Ausprobieren am Desktop ne' feine Sache ist, widerspricht aber für unsere Verwendung der Logik vom systemd. Der geht bei dem Verhalten des Scriptes davon aus, der frisch gestartete Dienst sei direkt verstorben. Weshalb der Start aus Sicht von systemd fehlgeschlagen ist und alles beendet wird. Auch unser Java-Prozess. Um das Problem zu lösen nimmt man dem Start des Java-Prozesses das kaufmänniche Und ("&"). Nun wartet das Script, bis sich (warum auch immer) der Java-Prozess beendet. Systemd startet ihn dann sofort wieder.
Naja und dann verwaltet das Startscript noch eine Pid und Start-Parameter, das alles brauchen wir unter Systemd auch nicht.
Den dazu nötigen Code entfernen wir dann noch, so dass sich das folgende Script ergibt:
Code:
#!/bin/sh

###################################################################################
# Shell script for starting Subsonic.  See http://subsonic.org.
#
# Author: Sindre Mehus
###################################################################################

SUBSONIC_HOME=/opt/subsonic
SUBSONIC_HOST=192.168.7.20
SUBSONIC_PORT=4040
SUBSONIC_HTTPS_PORT=0
SUBSONIC_CONTEXT_PATH=/
SUBSONIC_MAX_MEMORY=150
SUBSONIC_DEFAULT_MUSIC_FOLDER=/data/Musik
SUBSONIC_DEFAULT_PODCAST_FOLDER=/data/Musik
SUBSONIC_DEFAULT_PLAYLIST_FOLDER=/data/Musik

quiet=0
# Use JAVA_HOME if set, otherwise assume java is in the path.
JAVA=java
if [ -e "${JAVA_HOME}" ]
    then
    JAVA=${JAVA_HOME}/bin/java
fi

# Create Subsonic home directory.
mkdir -p ${SUBSONIC_HOME}
LOG=${SUBSONIC_HOME}/subsonic_sh.log
rm -f ${LOG}

cd $(dirname $0)
if [ -L $0 ] && ([ -e /bin/readlink ] || [ -e /usr/bin/readlink ]); then
    cd $(dirname $(readlink $0))
fi

${JAVA} -Xmx${SUBSONIC_MAX_MEMORY}m \
  -Dsubsonic.home=${SUBSONIC_HOME} \
  -Dsubsonic.host=${SUBSONIC_HOST} \
  -Dsubsonic.port=${SUBSONIC_PORT} \
  -Dsubsonic.httpsPort=${SUBSONIC_HTTPS_PORT} \
  -Dsubsonic.contextPath=${SUBSONIC_CONTEXT_PATH} \
  -Dsubsonic.defaultMusicFolder=${SUBSONIC_DEFAULT_MUSIC_FOLDER} \
  -Dsubsonic.defaultPodcastFolder=${SUBSONIC_DEFAULT_PODCAST_FOLDER} \
  -Dsubsonic.defaultPlaylistFolder=${SUBSONIC_DEFAULT_PLAYLIST_FOLDER} \
  -Djava.awt.headless=true \
  -verbose:gc \
  -jar subsonic-booter-jar-with-dependencies.jar > ${LOG} 2>&1

Wenn das soweit geändert ist, kann tatsächlich subsonic beim systemd angemeldet werden:
Code:
systemctl enable subsonic.service
und danach gestartet werden:
Code:
systemctl start subsonic.service
mittels
Code:
systemctl | grep subsonic
kann man nachschauen und erhält wenn alles geklappt hat
Code:
subsonic.service          loaded active running       Subsonic Sound-Server
So jetzt sollte alles funktionieren.

Bleibt mir nur noch daran zu erinnern, das rpm von dieser Installation nichts weiß. Was bedeutet das?
  • Die Abhängikeiten werden nicht überwacht. Rpm würde ohne Probleme zulassen, das Java gelöscht oder systemd durch das alte System v ersetzt wird. Hier gilt es mit Selbstdiziplin diese Packet nicht zu löschen. Leider habe ich da keine andere Lösung.
  • Es gibt keine automatischen Updates. Leider gibt es keinen RSS-Feed oder ähnliches, der einen über Updates informiert. Also immer mal wieder auf den Webseiten von Subsonic nachschauen.
  • Ok, das hat jetzt nicht viel mit rpm zu tun, aber der Yast-Runlevel-Editor ist noch sehr auf sys v Init-Scripte ausgerichtet. Da unser neu angelegter Subsonic-Dienst kein solches hat, taucht er im Runlevel-Editor nicht auf. Also nicht wundern, läuft ja trotzdem. :roll:
So ich hoffe, ich konnte irgendwem helfen. Bei Fragen und/oder Anregungen meldet Euch hier.

Viele Grüße
Arne
 
Oben