Linux Daemons registrieren

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:
     1COUNTER=0
     2while [ $COUNTER -lt 50 ]; do
     3  if some_check_function;
     4  then
     5    sleep 0.1
     6    COUNTER=$((COUNTER+1))
     7  else
     8    COUNTER=$((COUNTER+50))
     9  fi
    10done
    
  • 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

1update-rc.d myserviced defaults
2update-rc.d myserviced enable

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.

📧 📋 🐘 | 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!