
Linux Daemons registrieren
« | 17 Mar 2024 | »Wer richtet eigentlich Daemons (also Hintergrunddienste) in Linux ein?
Antwort: Die Distributionsmacher scripten sich das zusammen, wie sie es brauchen.
Aber was macht man als “3rd Party Developer?”
Die daemonize() Funktion ist nur der halbe Weg, man muss auch sicherstellen, dass der Daemon beim Start des Systems hochgefahren wird.
Init-Scripts und die LSB
Im klassischen Linux gibt es einen ungeschriebenen Standard für das Verwalten von Daemon-Scripts.
Ein Daemon mit Namen myserviced
…
- … liegt als Binär-Datei in
/usr/bin/myserviced
- … hat ein init-Script in
/etc/init.d/myserviced
- … nutzt eine PID-Datei mit Namen
/var/run/myserviced.pid
Aus der Linux-Standard-Base hatte ich dann folgenden Aufbau abgeleitet:
1#!/bin/sh 2### BEGIN INIT INFO 3# Provides: myserviced 4# Required-Start: $local_fs $network $named $remote_fs $syslog 5# Required-Stop: $local_fs $network $named $remote_fs $syslog 6# Default-Start: 3 4 5 7# Default-Stop: 0 1 2 6 8# Short-Description: myserviced service process 9# Description: myserviced is known best for healing cancer 10### END INIT INFO 11 12PATH=/sbin:/usr/sbin:/bin:/usr/bin 13NAME=myserviced 14DAEMON="/usr/bin/$NAME" 15DAEMON_ARGS= 16PIDFILE="/var/run/$NAME.pid" 17SCRIPTNAME="/etc/init.d/$NAME" 18 19#import init functions 20. /lib/lsb/init-functions 21 22do_start() 23{ 24 start_daemon -p $PIDFILE $DAEMON $DAEMON_ARGS 25} 26 27do_stop() 28{ 29 killproc -p $PIDFILE $DAEMON 30} 31 32do_statuscheck() 33{ 34 pidofproc -p $PIDFILE $DAEMON 35} 36 37case "$1" in 38 start) 39 do_start 40 ;; 41 stop) 42 do_stop 43 ;; 44 force-reload|reload|force-restart|restart) 45 do_stop 46 do_start 47 ;; 48 status) 49 do_statuscheck 50 ;; 51 *) 52 echo "Usage: $SCRIPTNAME {start|stop|restart|status}" 53 exit 1 54 ;; 55esac
Das funktionierte auf manchen Distros, aber nie auf allen, und so musste ich
aus-if-en, ob /lib/lsb/init-functions
überhaupt vorhanden war und
Workarounds für die Sonderfälle schreiben.
Ein paar solcher Alternativen sind:
- start-stop-daemon
Das sieht man auf auf Debian - startproc
Dieser non-Standard kam mir in SuSE unter $DAEMON $DAEMON_ARGS &
So startet man Daemons, wenn man nicht mehr weiter weiß.read PID < $PIDFILE
ps -p $PID > /dev/null 2>&1
… um zu wissen, ob der Daemon schon läuft- Noch schlimmer: auf etwas warten:
- Und noch einige andere Schweinereien
Script registrieren
Irgendwo liegt das Tool update-rc.d
, z.B. in
/sbin
/usr/sbin
/bin
/usr/bin
und hat man es gefunden, kann man es aufrufen mit
Erst jetzt ist das Init-Script im System registriert und wird automatisch ausgeführt, wenn das System startet (bzw. den richtigen Run-Level erreicht).
Teilweise Übergang zu systemd
Dieser ganze Zauber wurde zwischen 2010 und 2020 durch SystemD ersetzt … aber das ist eine andere Geschichte.
Doch weil es bis heute Umgebungen ohne systemd
gibt, wie z.B.
Docker
oder WSL 1,
sind Init-Scripts für Daemons immer noch ein Thema und in Debian
funktionieren die alten Tools bis heute.
Fazit
Kurz gesagt:
Nichts ist so unsäglich zersplittert wie das Daemon- und Initialisierungs-System von Linux.
(OK, Paket-Manager könnten das noch toppen.)
Jede Distribution wollte ihre Individualität einfließen lassen und so wurden über Jahrzehnte unzählige Arbeitsstunden für die Portierung verbraten.
Am Ende geht es aber immer nur darum:
- Starte einen Prozess im Hintergrund.
- Setze den Exit-Code so, dass 0 Erfolg und alles andere Misserfolg ausdrückt.
Klingt komisch … ist aber so.