GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So schreiben Sie Linux-Init-Skripte basierend auf dem LSB-Init-Standard

LSB steht für Linux Standard Base.

LSB wurde von der Linux Foundation ins Leben gerufen, um den Unterschied zwischen mehreren Linux-Distributionen zu verringern und dadurch die Kosten für die Portierung zwischen verschiedenen Distributionen zu reduzieren. Init-Skripte gehören zu denen, die standardisiert werden müssen.

In diesem Artikel werden wir sehen, wie man ein Init-Skript schreibt, das dem LSBInit-Standard entspricht.

Init-Skripte werden verwendet, um eine Software|Dienst zu starten|stoppen. Wenn Sie beispielsweise postgresql-Software verwenden, haben wir ein Init-Skript mit dem Namen „/etc/init.d/postgresql“, das verwendet werden kann, um „start|stop|restart|reload|force-reload|status“ auszuführen.

LSB-konforme Init-Skripte müssen:

  • Geben Sie mindestens „Start“, „Stopp“, „Neustart“, „Neuladen erzwingen“ und „Status“ an
  • Korrekten Exit-Code zurückgeben
  • Laufzeitabhängigkeiten dokumentieren

Optional können sie init.d-Funktionen wie „log_success_msg“, „log_failure_msg“ usw. verwenden, um die Meldungen zu protokollieren.

LSB bietet einen Standardsatz von Funktionen, der sich in /lib/lsb/init-functions befindet. Wir können diese Funktionen in unseren Init-Skripten verwenden. Alle Init-Prozesse protokollieren standardmäßig die PID des Prozesses in einer Datei im Verzeichnis /var/run/. Dies ist nützlich für die Init-Skripte, um den Status des Prozesses zu ermitteln.

Beginnen wir nun mit dem Schreiben eines Init-Skripts. Zuerst müssen wir dem Init-Skript einen Header hinzufügen, der wie folgt aussieht:

### BEGIN INIT INFO
# Provides:          my_daemon
# Required-Start:    postgresql networking
# Required-Stop:     postgresql networking
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: This is a test daemon
# Description:       This is a test daemon
#                    This provides example about how to
#                    write a Init script.
### END INIT INFO

Bietet gibt an, welche Einrichtung dieses Init-Skript bietet. Der Name sollte eindeutig sein.

Erforderlicher Start gibt den Satz von Einrichtungen an, die gestartet werden sollten, bevor dieser Dienst gestartet wird. In unserem Fall müssen postgresql und Netzwerk gestartet werden, bevor my_daemon gestartet wird. Denken Sie daran, dass „postgresql“ hier ein separates Init-Skript hat, das „Bereitstellt:postgresql“ lautet. Dies stellt ein abhängigkeitsbasiertes Booten sicher. Basierend auf dieser Abhängigkeit werden die Einträge mit dem Befehl „inserv“ oder „update-rc.d“ in Runlevel-Verzeichnissen mit der entsprechenden Sequenznummer abgelegt. Die Einträge können beispielsweise wie folgt aussehen

/etc/rc2.d/S12postgresql
/etc/rc2.d/S03networking
/etc/rc2.d/S13my_daemon

Was bedeutet, dass zuerst das Netzwerk gestartet wird, dann postgresql und dann my_daemon.

Um mehr über Runlevels zu erfahren, lesen Sie Phase 6 (Runlevel) des Linux-Startvorgangs.

Erforderlich-Stopp gibt die Liste der Einrichtungen an, die erst nach dem Stoppen dieser Einrichtung gestoppt werden müssen. Hier werden erst nach dem Stoppen von my_daemon die postgresql- und Netzwerkfunktionen gestoppt.

Standard-Start Standard-Stopp definiert die Runlevels, in denen der Dienst gestartet oder gestoppt werden muss.

Kurzbeschreibung und Beschreibung werden verwendet, um eine Beschreibung in Bezug auf die bereitgestellte Einrichtung zu geben. Die Beschreibung kann sich über mehrere Zeilen erstrecken, die Kurzbeschreibung ist auf eine Zeile beschränkt.

Schauen wir uns ein tatsächliches Init-Skript an.

### BEGIN INIT INFO
# Provides:          my_daemon
# Required-Start:    postgresql networking
# Required-Stop:     postgresql networking
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: This is a test daemon
# Description:       This is a test daemon
#                    This provides example about how to
#                    write a Init script.
### END INIT INFO

# Using the lsb functions to perform the operations.
. /lib/lsb/init-functions
# Process name ( For display )
NAME=my-daemon
# Daemon name, where is the actual executable
DAEMON=/home/user1/my_daemon
# pid file for the daemon
PIDFILE=/var/run/my_daemon.pid

# If the daemon is not there, then exit.
test -x $DAEMON || exit 5

case $1 in
 start)
  # Checked the PID file exists and check the actual status of process
  if [ -e $PIDFILE ]; then
   status_of_proc -p $PIDFILE $DAEMON "$NAME process" && status="0" || status="$?"
   # If the status is SUCCESS then don't need to start again.
   if [ $status = "0" ]; then
    exit # Exit
   fi
  fi
  # Start the daemon.
  log_daemon_msg "Starting the process" "$NAME"
  # Start the daemon with the help of start-stop-daemon
  # Log the message appropriately
  if start-stop-daemon --start --quiet --oknodo --pidfile $PIDFILE --exec $DAEMON ; then
   log_end_msg 0
  else
   log_end_msg 1
  fi
  ;;
 stop)
  # Stop the daemon.
  if [ -e $PIDFILE ]; then
   status_of_proc -p $PIDFILE $DAEMON "Stoppping the $NAME process" && status="0" || status="$?"
   if [ "$status" = 0 ]; then
    start-stop-daemon --stop --quiet --oknodo --pidfile $PIDFILE
    /bin/rm -rf $PIDFILE
   fi
  else
   log_daemon_msg "$NAME process is not running"
   log_end_msg 0
  fi
  ;;
 restart)
  # Restart the daemon.
  $0 stop && sleep 2 && $0 start
  ;;
 status)
  # Check the status of the process.
  if [ -e $PIDFILE ]; then
   status_of_proc -p $PIDFILE $DAEMON "$NAME process" && exit 0 || exit $?
  else
   log_daemon_msg "$NAME Process is not running"
   log_end_msg 0
  fi
  ;;
 reload)
  # Reload the process. Basically sending some signal to a daemon to reload
  # it configurations.
  if [ -e $PIDFILE ]; then
   start-stop-daemon --stop --signal USR1 --quiet --pidfile $PIDFILE --name $NAME
   log_success_msg "$NAME process reloaded successfully"
  else
   log_failure_msg "$PIDFILE does not exists"
  fi
  ;;
 *)
  # For invalid arguments, print the usage message.
  echo "Usage: $0 {start|stop|restart|reload|status}"
  exit 2
  ;;
esac

Das obige Skript stellt im Grunde eine Vorlage zum Schreiben von LSBInit-Skripten bereit. Sie können die Variablen DAEMON, PIDFILE, NAME und den Header ändern, um dieses Skript an Ihre eigenen Programme anzupassen.

Um mehr über die vom LSB bereitgestellten Funktionen zu erfahren, lesen Sie bitte InitScript-Funktionen

Führen Sie nach Abschluss des Init-Skripts den folgenden Befehl aus, damit das Skript automatisch gestartet oder gestoppt wird. Dadurch werden die entsprechenden „S“- und „K“-Einträge in den angegebenen Runlevels hinzugefügt. Dadurch wird auch die entsprechende Sequenznummer hinzugefügt, indem die Abhängigkeiten berücksichtigt werden.

update-rc.d filename defaults

Linux
  1. So schreiben Sie Protokolldateien im RAM mit Log2ram unter Linux

  2. 10 insserv-Befehlsbeispiele für Linux-System-Init-Skripte

  3. So schreiben Sie einen Linux-Daemon mit .Net Core

  4. Wie überprüfe ich die Laufwerkstemperatur unter Linux?

  5. Wie geht Linux mit Shell-Skripten um?

So analysieren Sie CSV-Dateien in Bash-Skripten unter Linux

Shell-Scripting für Anfänger – So schreiben Sie Bash-Scripts unter Linux

So finden Sie Dateien basierend auf dem Zeitstempel in Linux

So verwenden Sie den Echo-Befehl in Bash-Skripten unter Linux

Wie man ein C-Programm unter Linux schreibt und ausführt

Wie schreibe ich auf eine virtuelle Webcam unter Linux?