Dienste unter Unix / Linux richtig automatisch starten

(Last Updated On: 14. Juni 2015)

Dienste beim Neustart automatisch starten

Wenn Sie Dienste beim Neustart des Systems automatisch starten wollen, haben Sie verschiedene Möglichkeiten

Was nicht funktioniert

Erstmal wollen wir abklären, was nicht funktioniert. Sie werden im Internet desöfteren auf Tipps stoßen, die Befehle zum Starten der Dienste in die Dateien ~/.bashrc, ~/.profile oder /etc/profile reinzuschreiben. Die dort stehenden Befehle werden aber nur ausgeführt, wenn Sie sich vorher einmal manuell an der Konsole anmelden. Das wollen Sie natürlich nicht, weil dies mit manueller Arbeit verbunden ist.

Lösung über /etc/init.d und /etc/rc<n>.d

Die gängigste Lösung ist eigentlich immer, ein Skript unter /etc/init.d zu erstellen, welche Sie benutzen, um den jeweiligen Dienst zu starten. dieses Skript verlinken Sie dann in den Ordner /etc/rc.d oder /etc/rc<n>.d

Das <n> steht dabei für den Runlevel, unter welchem der Dienst gestartet werden soll. Den aktuellen Runlevel Ihres Systems bekommen Sie über den Befehl

$> runlevel

oder

$> who -r

Der gängiste Runlevel ist der Runlevel 2. Das heißt, meistens verlinken Sie das Skript unter /etc/rc2.d

Die Skripte sollten in der Regel dem User root gehören, da die meisten ihrer dienste als User root gestartet werden. Ausnahmen bilden hier natürlich die Regel. Dienste wie beispielsweise der Apache Webserver werden in der Regel mit einem anderen User wie etwa www-data gestartet. Wie Sie diese dienste mit anderen Usern starten können, zeige ich Ihnen weiter unten.

Lösung über /etc/rc.local

Anstatt eine extra Datei im Ordner /etc/init.d zu erstellen und diesen in den jeweiligen Runlevel Ordner /etc/rc<n>.d zu verlinken, können Sie auch einfach die Befehle zum Starten des Dienstes direkt in die Datei /etc/rc.local schreiben. Dieses Skript wird auch als User root ausgeführt, genua wie die Skjripte unter /etc/rc<n>.d. Daher muss man auch hier bei allen Befehlen kein Sudo angeben. Der nachteil ist, dass man mit diesen Skripten nur den Start beim Neustart regelt. AMn hat dann immer noch keine Lösung etabliert, um einen bestimmten Dienst separat von allen anderen zu starten oder zu stoppen, was man mit der lösung über /etc/init.d gemacht hätte.

Lösung über /etc/init

/etc/init gehört zu Upstart, einem neuartigen Tool, welche das Hochfahren von Linux / Unix-Daemons beschleunigen soll, da er die Dienste nicht stur hintereinander startet, wie es beispieslweise mit den Skripten unter /etc/rc2.d passieren würde, sondern einen optimierten Algorithmus verwendet. Sie können unter /etc/init genau so wie unter /etc/init.d und /etc/rc2.d für jeden Dienst ein extra Startskript erstellen. Dieses Skript wird dann automatisch beim Systemstart ausgeführt, zumindest unter allen Systemen, die Upstart standardmäßig integriert haben, etwa der Ubuntu server.

Hier wird empfohlen, dass Sie als Namen den Namen des Dienstes + die Dateiendung .conf verwenden. Wenn Sie also beispielsweise ein Startskript für den Dienst Syncthing erstellen wollen, dann nennen Sie das Skript syncthing.conf.

Lösung über Cronjob

Sie können einen Dienst beim Neustart auch über einen Cronjob neu starten. Dazu editieren Sie einfach die Datei /etc/crontab und schreiben den Befehl zum Starten des Dienstes rein. Als Zeitpunkt zum Starten geben Sie nicht wie üblich eine Uhrzeit ein, sondern @reboot.

Dienste nur in einem bestimmten Runlevel starten

In dieser Überschrift werde ich Ihnen zeigen, wie Sie mit einer der oben angedeuteten lösungen einen Dienst nur unter einem bestimmten Runlevel starten

Lösung mit /etc/init.d und /etc/rc<n>.d

Wie bereits oben angedeutet, können Sie einen Daemon automatisch bei Neustart starten, indem Sie erst ein Skript unter /etc/init.d erstellen und dieses dann in den Ordner /etc/rc<n>.d verlinken. Das <n> steht dabei für den Runlevel, unter dem der Daemon gestartet werden soll. Wenn Sie das Skript in den Ordner /etc/rc.d reinschieben, wird der Daemon in jedem Runlevel gestartet.

Lösung über Upstart /etc/init

upstart unterstützt Direktiven in seinen .conf-Skripten unter /etc/init, die das Festlegen von Runleveln erlauben, unte rdenen das Skriopt ausgeführt werden soll.

Ein gutes /etc/init/<xxx>.conf-Skript beginnt in der Regel beispielswiese immer mit folgenden Angaben

description "<beschreibung für den Daemon>"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]

exec <Pfad zum Daemon>

 

Dieses Skriptfunktioniert so, dass es die Befehle zum Starten des Dienstes nur dann ausführt, wenn bereits das loakle dAteisystem geladen und alle Netzwerkadapter online sind UND sich das System in den Runlevels 2, 3, 4 oder 5 befindet. im ‚Runlevel 1 wird das Skript nicht zu Ende ausgeführt. Somit können Sie kontrollieren, auf welchen Runleveln der Daemon gestartet wird, und auf welchen nicht.

dienst unter einem anderen User als root starten

Einige Dienste, wie beispielsweise ein IRC Eggdrop, der IRC Bouncer ZNC, der Apache Webserver und diverse andere wehren sich aus Sicherheitsgründen dagegen, als User „root“ ausgeführt zu werden.  Es gibt unterschiedliche Verfahren, um solche Dienste automatisiert als ein anderer Benutzer ausführen zu lassen

Lösung über Daemon

egal welche der oben genannten Lösungen sie wählen. Mit dem Tool daemon können Sie jeden x-beliebigen Serverdienst als ein User Ihrer Wahl ausführen. Dazu müssen Sie das Skript, welches Sie beispielsweise unter /etc/init.d oder /etc/init erstellt haben, mit chown diesem User als Besitzer übergeben und mit chmod +x das Skript ausführbar machen. Danach installieren wir daemon mit

apt-get install daemon

An die Stelle im Skript, an der Sie normalerweise den Daemon starten, schrieben Sie dann sowas wie

env HOME=/home/<username>
daemon --user=<username> /<pfad/zum/serverdienst> &>/dev/null &

Lösung über upstart

Auch mit upstart können Sie bestimmte Direktiven in Ihren .conf-Dateien unter /etc/init angeben, mit denen Sie den User, unter dem ein Service gestartet wird, wechseln können. Ein solches Skript würde beispielsweise so aussehen

description "Syncthing P2P sync service"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]

env HOME=/home/<username>
setuid "<username>"
setgid "<username>"

exec <Pfad zum SErverdienst>

Den ersten Teil des Skripts kennen wir bereits von den oberen Kapiteln. Der Dienst wird nur in den Runlevels 2, 3, 4 oder 5 gestartet und erst dann, wenn DAteisytem und netzwerkinterfaces gestartet wurden.

Danach setzen wir die Variable HOME sopwie user- und gruppenid auf den User, unter dem der Dienst ausgeführt werden soll, und führen den SErverdienst dann als dieser User am Ende des Skripts aus.

Serverdienst automatisch neu starten, wenn er crasht

Vielleicht wollen Sie noch eine Lösung implementieren, mit der Sie IÄhren SErverdienst automatisch neu starten, sobald dieser einmal crasht oder aus Versehen beendet wird. Ich zeige Ihnen im Folgenden, wie

Lösung über /etc/init.d, crontab oder rc.local

Egal welche dieser drei Lösungsansätze von den oberen Kapiteln Sie genommen haben: Die hier vorgestellte Lösung funktioniert mit allen mitteln.

Sie ändern einfach den Code, den Sie verwenden, um den SErverdiesnt zu starten, ab. Statt beispielsweise einfach nur zu schreiben

<Pfad zum Daemon>

Schreiben Sie

#!/bin/sh
while true; do
<Pfad zum Daemon>
done

Dieses Skript wird dann einmal beim Neustart des Rechners automatisch ausgeführt. Was das Skript macht ist, den Serverdienst immer und immer wieder zu starten, was den meisten Serverdaemons nicht weh tut, da diese erkennen, wenn der Serverdienst bereits läuft und daher automatisch den Startvorgang abbrechen, wenn bereits ein Daemon läuft. Sobald der Daemon jedoch einmal abstürzt, erkennt das Skript, dass kein Daemon mehr läuft, und das Skript startet den Dienst autoamtisch neu. So wird der Dienst ohne ihr zutun automatisch nue gestartet, sobald er einmal abstürzt.

Lösung mit upstart /etc/init

Auch mit Upstart gibt es Direktiven, mit denen Sie ienen Serverdienst beim Absturz automatisch neu starten können.

Dazu nehmen wir einfach das weiter oben stehende Skript und ändern es nochmla etwas ab

description "Syncthing P2P sync service"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]

env STNORESTART=yes
env HOME=/home/<username>
setuid "<username>"
setgid "<username>"

exec <Pfad zum Daemon>

respawn

Das Skript  startet jetzt den SErverdaemon automatisch neu, sobald er einmal abstürzt.

Serverdienst im Hintergrund ausführen

Zu guter letzt wollenw ir noch konfigurieren, dass Serverdienst im Hintergrund ausgeführt werden. Einige Serverdienst blockieren Ihnen nämlich die Kommandozeile, wenn Sie sie starten, heißt: Sie können keine neuen Befehle in die Shell eintippen, solange der Serverdienst läuft. Erst Wenn Sie Strg+C drücken und damit den Serverdienst beenden, könnten Sie weiterarbeiten. Dieses problem umgehen Sie, indem sie den serverdienst in einer anderen Session „im Hintergrund“ ausführen lassen, so dass Sie auf Ihrer normlaen Shell-Session weiterarbeiten können.

Wir benutzen hier das tool screen. Das Tool SCreen eröffnet eine neue Session, in welcher der Serverdienst dann ausgeführt wird. Diese Session bekommt einen Namen. WEnn Sie im Anschluss in der shell das kommando screen -r <screen_session_name> eingeben, können Sie zu dieser Session wechseln und sich den aktuellen Status des Serverdienstes ansehen oder ihn mit Strg+C beenden. Mit Strg+A+D kommen Sie aus der Screen-Session wieder heraus und können auf einer freien Shell-Session weiterarbeiten.

Lösung über /etc/init.d, crontab und rc.local

Egal welche der drei Lösungen zum automatischen Start des serverdienstes Sie gewählt haben, Sie können mit dem Tool screen den Serverdienst folgendermaßen im Hintergrund starten.

#!/bin/sh
if [ -z "$STY" ]; then exec screen -d -m -S <screen_session_name> /bin/bash "$0"; fi
<pfad zum Serverdienst>

Lösung über upstart /etc/init

auch mit Upstart können Sie einen Serverdienst einfach über Screen im Hintergrudn ausführen, hier lautet der Befehl entsprechend

description "Syncthing P2P sync service"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]

env STNORESTART=yes
env HOME=/home/<username>
setuid "<username>"
setgid "<username>"
expect fork
exec setsid screen -Dm -S <screen_session_name> <Pfad zum Daemon>

respawn

Alles kombiniert

Die folgenden Skripte kombinieren alle Schritte miteinander: wir starten beim Systemstart automatishc einen Daemon nur unter bestimmten, vordefinierten Runleveln. Wir starten den Dienst als ein bestimmter User im Hintergrund und starten ihn automatisch neu, sobald er einmal abstürzt. Leider kenne ich keine Lösung für rc.local und Cronjobs, die alle Möglichkeiten kombiniert. Deswegen gibt es hier nur Lösungen für /etc/rc<n>.d und für upstart

Lösung über /etc/init.d und /etc/rc<n>.d

Wir erstellen unter /etc/init.d ein Skript und verlinken es unter den /etc/rc<n>.d-Ordnern für die jeweiligen Runlevel, unter denen der Daemon gestartet werden soll. Unter /etc/init.d erstlelen wir dazu ein Skript background<dienstname> mit foglendem Inhalt.

#!/bin/sh
if [ -z "$STY" ]; then exec screen -d -m -S <screen_session_name> /bin/bash "$0"; fi
sh <Pfad zur Skriptdatei>

im selben Ordner /etc/init.d erstellen wir dann noch das Skript start<dienstname>.sh mit folgendem Inhalt

env HOME=/home/<username>
while true; do
daemon --user=<username> /<pfad/zum/serverdienst> &>/dev/null &
done

die beiden Skripte müssen Sie noch ausführbar machen und dem User geben, unter der Dienst ausgeführt werden soll

chwon <username> /etc/init.d/background<dienstname>
chown <username> /etc/init.d/start<idenstname>.sh
chmod +x /etc/init.d/background<dienstname>
chmod +x /etc/init.d/start<dienstname>.sh

und eine verlinkung machen zu den Runlevel-Ordnern, die Sie haben wollen

ln -s /etc/init.d/background<dienstname> /etc/rc<n>.d/S99background<dienstname>

Lösung über upstart /etc/init

hier müssen Sie im Ordner /etc/init einfachc nur eine datei <dienstname>.conf erstellen mit folgendem Inhalt

description "Syncthing P2P sync service"

start on (local-filesystems and net-device-up IFACE!=lo)
stop on runlevel [!2345]

env STNORESTART=yes
env HOME=/home/<username>
setuid "<username>"
setgid "<username>"
expect fork
exec setsid screen -Dm -S <screen_session_name> <Pfad zum Daemon>

respawn

Dann müssen Sie das Skript noch ausführbar machen

chmod +x /etc/init/<dienstname>.conf

 

 

 

Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.

DaFRK

Andreas Loibl ist SAP-Berater, Ethical Hacker und Online Marketing Manager und schreibt auf seinem Blog DaFRK Blog über verschiedene Themen in den Sektoren Projektmanagement, Informationstechnik, Persönlichkeitsentwicklung, Finanzen und Zeitmanagement.

Das könnte Dich auch interessieren...

Kommentar verfassen

This site uses Akismet to reduce spam. Learn how your comment data is processed.