Serengeti darf nicht sterben

Die mobile Denkfabrik  –  7 Kommentare

In einer idealen Welt hat jeder Handcomputerentwickler einen Serveradmin zur Seite, der für den serverseitigen Code zuständig ist. In der Praxis müssen Apps oft mit zusammengehackten Servern zurechtkommen, die von Zeit zu Zeit abstürzen. Die daemontools helfen bei der Überwachung.

Es handelt sich dabei um eine Gruppe kleiner Hilfsprogramme, die auf die Analyse von laufenden (und sterbenden) Prozessen spezialisiert sind. Unter Raspbian lässt sich die Installation per apt-get erledigen:

pi@raspberrypi ~ $ sudo apt-get install daemontools-run daemontools 
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
daemontools daemontools-run
0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded.
Need to get 75.2 kB of archives.
. . .

Eine vollständige Beschreibung der von D. J. Bernstein entwickelten daemontools würde den Rahmen dieses Blogposts sprengen – die offizielle Dokumentation ist hier einsehbar. Ich will mich auf die Verwendung von supervise beschränken – das Programm ist auf das Laufend-Halten von absturzgeneigten Prozessen spezialisiert.

Wie alle anderen in daemontools enthaltenen Programme setzt auch diese Applikation auf ein "Produktverzeichnis". Dabei handelt es sich um einen Ordner im Dateisystem, der zur Identifikation der Aufgabe dient.

Im Fall des Beispielservers – das Produkt hört auf den Namen PirnaServer – wird der Ordner einfach im Arbeitsverzeichnis des Pi-Nutzers erstellt. Danach erstellt man dort eine Datei namens run, die folgenden Inhalt bekommt:

GNU nano 2.2.6 New Buffer Modified 

#!/bin/sh

./PirnaServer

Nach dem Speichern muss run per chmod als ausführbar gekennzeichnet werden. Danach folgt der folgende Aufruf von supervise. Es durchsucht den übergebenen Ordner nach einer .run-Datei:

pi@raspberrypi ~ $ supervise pirnaordner/ 

Ab diesem Zeitpunkt wird der PirnaServer immer am Leben gehalten, wenn supervise läuft. Probieren Sie es bei Bedarf aus, indem Sie den Aufruf – wie gewohnt – in ein TMUX-Terminal verfrachten. Verlassen Sie dieses danach und eliminieren Sie den Server mit dem killall-Kommando.

Damit fehlt nur noch eine Kleinigkeit. Im Moment stirbt der Service, sobald das TMUX-Fenster das Zeitliche segnet. Zur Behebung dieses Problems muss man den Server im Rahmen des Systemstarts erzeugen. Denn die vorgestellte Lösung hilft an dieser Stelle nicht weiter, da supervise nach einem Reboot des Systems nicht mehr weiterläuft. Zur Umgehung dieses Problems ist supervise im Rahmen des Systemstarts anzuwerfen.

Dazu muss man eine Datei ändern. Der genaue Pfad dorthin ist von System zu System unterschiedlich, im Fall des am Raspberry Pi arbeitenden Raspbians ist es das File /etc/rc.local. Öffnen Sie es in einem Editor wie pico und ergänzen Sie es um einen Aufruf von supervise. Im Fall eines Raspberry Pi sieht die neue Version so aus:

GNU nano 2.2.6 File: /etc/rc.local Modified 

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
printf "My IP address is %s\n" "$_IP"
fi

supervise /home/pi/pirnaordner/

exit 0

Nach dem Speichern dieser Änderungen starten sie den betreffenden RaspBerry Pi einfach neu. Nach dem Reboot startet der Server automatisch und wird nach dem Beenden durch supervise automatisch wieder hochgefahren.