silvesterlangen.de

Seite
Menü

Auto-Start/-Stop

In diesem Howto zeige ich wie man Skripte beim booten und herunterfahren von Linux startet bzw. anhält. Sozusagen "Autostart" von Linux, wenn man so will.

 

Der Debian"weg"

Debian arbeitet ein bisschen anders als bspw. Red Hat/CentOS. Damit Debian ein Skript beim Bootvorgang starten und später wieder anhalten kann benötigt es innerhalb seines Skriptes, welches ausgeführt werden soll einen Start- und einen Stop-Parameter. Ich zeige hier ein kleines Skript, um zu verstehen wie das gemeint ist. Das Skript muss unbedingt in den Ordner /etc/init.d/ gelegt werden und mit entsprechenden Rechten (755) versehen werden.

 

#/bin/bash
case "$1" in
start)
hier die Zeilen, die ausgeführt werden sollen für den Start.
;;
stop)
hier die Zeilen, die ausgeführt werden sollen für den Stop.
;;
*)
echo "Bitte $0 start oder $0 stop benutzen."
exit 1
;;
esac
exit 0

Dieses Skript könnte ein Startscript für einen Dienst sein, den man beim booten des Servers oder Workstation ausführen möchte. Es müssen mindestens wie fett hervorgehoben Start und Stop möglich sein.

Das reicht aber so noch nicht ganz aus, denn es fehlt noch ein auskommentierter Teil (der INIT INFOTeil) im Skript (Orange), dass das System erkennt in welchem Runlevel das Skript mit welchen Parametern gestartet bzw. später wieder gestoppt wird.

 

#!/bin/bash
### BEGIN INIT INFO
# Provides: firewall
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: My Firewall Script
# Description: Starts my Firewall Script with super cow forces!
### END INIT INFO
case "$1" in
start)
hier die Zeilen, die ausgeführt werden sollen für den Start.
;;
stop)
hier die Zeilen, die ausgeführt werden sollen für den Stop.
;;
*)
echo "Bitte $0 start oder $0 stop benutzen."
exit 1
;;
esac
exit 0

Der orange markierte Teil ist die INIT INFO. Darin wird festgelegt mit welchem Namen das Script im initd geführt wird, in welchen Runleveln das Skript ausgeführt wird und in welchen Runleveln gestoppt wird. Außerdem kann ich Startparameter mitgeben, falls das Script außer "start" und "stop" noch bestimmte Parameter benötigt.

Danach in der Shell ein update-rc.d firewall defaults ausführen und schon erkennt initd das Firewallscript.

 

Debian Stretch Besonderheit

Da Debian etwas anders ist, ist die Datei /etc/rc.local möglicherweise nicht vorhanden. Wenn das so ist, dann ist folgender Weg zu beschreiten:

  1. Die Datei /etc/systemd/system/rc-local.service erstellen und mit folgendem Inhalt füllen:

    [Unit]
    Description=/etc/rc.local
    ConditionPathExists=/etc/rc.local

    [Service]
    Type=forking
    ExecStart=/etc/rc.local start
    TimeoutSec=0
    StandardOutput=tty
    RemainAfterExit=yes
    SysVStartPriority=99

    [Install]
    WantedBy=multi-user.target

  2. Danach die Datei /etc/rc.local erstellen und mit folgendem Inhalt füllen:

    #!/bin/sh -e
    #
    # rc.local
    #
    # This script is executed at the end of each multiuser runlevel.
    # Make sure that the script will "exit 0" on success or any other
    # value on error.
    #
    # In order to enable or disable this script just change the execution
    # bits.
    #
    # By default this script does nothing.

    exit 0

  3. Dann den Service rc-local lauffähig (ausführbar) machen und enablen. Danach weiter mit dem Punkt "Andere Distributionen".

    chmod +x /etc/rc.local
    systemctl enable rc-local
    systemctl start rc-local.service

     

Andere Distributionen

Nehmen wird das Skript von oben noch ein mal. Allerdings ohne INIT-INFO-Zeilen, also beginnend mit case "$1" in ...

Das Skript speichern wir irgendwohin wo es ausgeführt werden soll. Ein Firewallscript könnte bspw. in /etc/firewall/ liegen. Natürlich muss das Script wieder ausführbar sein (755). Danach tragen wir  in /etc/rc.local vor "exit 0" das Firewallscript mit absolutem Pfad und dem Parameter "start". Das war es auch schon.

Das könnte dann also wie folgt ausschauen.

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Beispiel: /etc/firewall/firewall.sh start exit 0


Autostart mit Systemd

Für ein Systemd lässt sich das auch ganz einfach regeln. Hier gehe ich von einem fertigen Firewall-Script aus, welches in /usr/local/bin/firewall/myfirewall.sh gespeichert ist und diese Datei ausführbar ist.

Zuerst das Service-Unit anlegen. Dazu bspw. die Datei /etc/systemd/system/myfirewall.service anlegen und mit folgendem Inhalt füllen:

[Unit]
After=network.target
[Service]
ExecStart=/usr/local/bin/firewall/myfirewall.sh
[Install]
WantedBy=default.target

Danach Systemd "reloaden", den Service "enablen" und dann starten.

systemctl daemon-reload
systemctl enable myfirewall.service
iptables -nvL

 

« vorige Seite Seitenanfang nächste Seite »
Seite
Menü
Earned Certificates:
LPIC-1 LPIC-1 LPIC-1
Powered by CMSimple | Template by CMSimple | Login