Shell Start Script mit automatischen Neustart

Falls ihr auf der Suche nach einem Shell Start Script seit, habt ihr es hier gefunden. Für das OpenSource Datawarehouse Metabase habe ich mir ein Script geschrieben, welches den Prozess startet und überwacht. Systemd als Service Manager kommt dabei ebenfalls zum Einsatz und sorgt dafür, dass das Script beim Starten des Servers ausgeführt wird. Sollte Metabase nicht mehr Laufen oder der Prozess sich beendet haben, startet das Script es einfach erneut und protokolliert dies in der Log. Die Grundbasis kann dabei für jegliche Prozesse benutzt werden, die automatisch neu gestartet werden sollen.

Shell Start Script

Vor einiger Zeit hatte ich schon etwas ähnliches für Metabase geschrieben. Den alten Artikel könnt ihr hier finden. Auch wenn es mir damals sehr geholfen hat, bin ich diesmal einen gänzlich anderen Weg gegangen. Statt des manuellen Ausführens, folgt dies nun über Systemd, wo ich weiter unten mehr zu schreibe. Wir deklarieren zwei Variablen name und waittime. Name ist der eindeutige Prozessname, um ihn in der Prozessliste mit ps ausfindig machen zu können. Die waittime indes, besagt nur das er sich am Ende kurz für 5 Sekunden schlafen legt, bevor er wieder von vorne anfängt.


Der wichtigste Part ist in der while true Schleife. In process schreiben wir die Ausgabe von ps, falls ein Prozess vorhanden ist. In diesem Fall würde rc = 0 bzw. true sein. Ist die Suche erfolglos haben wir ein rc = 1 bzw. false. Dies ist wichtig für die darauffolgende If-Abfrage, die wir negiert haben. Sollte also kein Prozess vorhanden sein, gehen wir in den If Block, andernfalls wären wir schon am Ende angekommen und würden 5 Sekunden warten. Im Block deklarieren wir die MB_DB_CONNECTION_URI, die für Metabase benötigt wird. Danach folgt der eigentliche Start über java und eine weitere while Schleife. Diese verweilt solange, bis der Server auf Port 3000 lauscht, also der Port, den Metabase benutzt. Somit stelle ich sicher, dass Metabase gestartet ist und der Prozess auffindbar ist. Wir wären auch hier nun am Ende angekommen. Wie vorher warten wir ebenfalls 5 Sekunden, bevor alles erneut anfängt. Diesmal greift der If-Block allerdings nicht, da der Prozess nun gestartet ist.

#!/bin/bash

name="java -jar /var/www/html/Metabase/metabase.jar"
waittime=5

if [ ! -d "/var/log/Metabase" ]
then
                mkdir "/var/log/Metabase"
fi

while true
do
        process=`ps aux | grep "${name}" | grep -v grep`
        rc=$?

        if [ ! $rc -eq 0 ]
        then
                echo "`date +%Y-%m-%d\ %T` INFO `basename $0` :: starting Metabase..." >> /var/log/Metabase/metabase`date +%V`.log
                export MB_DB_CONNECTION_URI="mysql://<ip>:<port>/<database>?user=<user>&password=<password>&serverRsaPublicKeyFile=/var/lib/mysql/public_key.pem"
             
                java -jar /var/www/html/Metabase/metabase.jar >> /var/log/Metabase/metabase`date +%V`.log &
                while [ ! `netstat -tapen | grep LISTEN | grep 3000 | awk '{print $9}'` ]
                do
                        sleep 1
                done
                echo "`date +%Y-%m-%d\ %T` INFO `basename $0` :: Metabase was started" >> /var/log/Metabase/metabase`date +%V`.log
        fi
        sleep ${waittime}
done

Systemd einrichten

Systemd ist ein Hintergrundprogramm in Linuxsysteme. Es ist ein Init-Prozess, somit der erste Prozess(Prozess-ID 1) und sorgt für das Starten, Beenden und Überwachen weiterer Prozesse. Weitestgehend ist systemd zum Standard in Linux-Distributionen geworden und so verwende ich es auch hier. Für Metabase richten wir in systemd eine neue Unit ein. Dies machen wir, indem wir eine neue Datei Namens metabase.service in /etc/systemd/system anlegen. Mit dem folgenden Codeblock wird unser Script nach der Netzwerkinitialisierung automatisch gestartet.

[Unit]
Description=Metabase
Documentation=https://www.metabase.com
After=network.target

[Service]
Type=simple
ExecStart=/var/www/html/Metabase/run_metabase.sh

[Install]
WantedBy=multi-user.target
Alias=metabase.service

Falls nicht schon automatisch passiert, müssen wir unsere neuen Dienst aktivieren

sudo systemctl enable metabase.service 

Das Script läuft jetzt in Dauerschleife durch. Wie bei allen üblichen systemd-Prozessen können wir unseren erstellen Dienst mit systemctl starten.

sudo systemctl start metabase.service

Aber auch stoppen und Überwachen lässt sich der Dienst über systemctl.

#stoppen
sudo systemctl stop metabase.service 

#überwachen
sudo systemctl status metabase.service 

Wir wären somit am Ende angelangt. Sollte Metabase nun nicht mehr laufen, wird es automatisch direkt neu gestartet. Dieser Vorgang ist selbstverständlich auch auf andere Dienste übertragbar und nicht nur an Metabase gekoppelt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.