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