Frage Wie erkennt man, wenn das Netzwerk im Skript /etc/init.d initialisiert wird?


Ich habe ein /etc/init.d/ -Skript, das beim Booten startet und erfordert, dass Netzwerk vorhanden ist. Ich habe den RC-Start auf 99 gesetzt, also ist es das Letzte, was geladen wird, aber das Netzwerk wird nicht sofort geladen und ich bin momentan auf einen 30-Sekunden-Schlafbefehl angewiesen, um auf das Laden des Netzwerks zu warten.

Das OS ist Ubuntu für Embedded-Systeme modifiziert (Yocto Project). Das Dateisystem ist das gleiche, aber es gibt sehr begrenzte Dienste, so dass es Sysvinit verwendet.

Gibt es eine Möglichkeit zu überprüfen, ob das Laden aller Netzwerke abgeschlossen ist?

Hier ist das Skript, wenn es hilft:

#!/bin/sh
#
# Daemon Name: blerd
#  
# chkconfig: - 3 99 1
# description: M3 Bluetooth Low Energy Relay Daemon

# Source function library.
. /etc/init.d/functions

PROGRAM=bler
LOCKFILE=/var/lock/subsys/$PROGRAM

start() { 
    [ -x $EXE ] || exit 5

    echo -n "Starting $PROGRAM: ";

    if [ -e $LOCKFILE ]; then
        echo "Instance of $PROGRAM exists."
        return 0;
    fi

    sleep 30
    $PROGRAM
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo "Success"
    else
        echo "Failed"
    fi

    [ $RETVAL -eq 0 ] && touch $LOCKFILE
    return $RETVAL
}

stop() {
    echo -n "Stopping $PROGRAM: "

    if [ ! -e $LOCKFILE ]; then
        echo "No instance of $PROGRAM exists."
        return 0;
    fi

    killproc $PROGRAM
    RETVAL=$?
    if [ $RETVAL -eq 0 ]; then
        echo "Success"
    else
        echo "Failed"
    fi

    [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
    return $RETVAL
}

status() {
    echo -n "Status $PROGRAM: "
    if [ -e $LOCKFILE ]; then
        echo "Running"
    else
        echo "Stopped"
    fi
    return 0;
}

# See how we were called.
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart}"
        exit 2
        ;;
esac

5
2017-12-09 19:00


Ursprung


Antworten:


Der grundlegende Debian-Weg:

Grundsätzlich gilt /etc/network/if-up.d ist der Ort für solche Skripte. Diese Skripte werden aufgerufen, wenn eine Schnittstelle auf einem Debian-System läuft oder abgeleitet wird - wie Ubuntu. Hier finden Sie eine Liste der Umgebungsvariablen, die an diese Skripte übergeben werden. Mit diesen Variablen können Sie entscheiden, welche Schnittstelle aufgerufen wird und welche Konfiguration die Schnittstelle hat. Sie können Beispiele für solche Scripts finden, wenn Sie sich damit beschäftigen /etc/network/if-up.d

Ein Beispielskript könnte so aussehen (abgeleitet vom Samba-Paket. Nur um zu erklären, wie die Dinge funktionieren. Wenn Sie Ubuntu verwenden, sollten Sie es verwenden upstart wird später erklärt)

/etc/network/if-up.d/your-service

#!/bin/sh
# Try to bring nmbd up when an interface comes up, if smbd is already running.

# Don't bother to do anything for lo.
if [ "$IFACE" = lo ]; then
    exit 0
fi

# Only run from ifup.
if [ "$MODE" != start ]; then
    exit 0
fi

# we only care about inet and inet6.
case $ADDRFAM in
    inet|inet6|NetworkManager)
        ;;  
    *)  
        exit 0
        ;;  
esac


# start the service
invoke-rc.d your-service start >/dev/null

exit 0

Hinweis das musst du

chmod +x /etc/network/if-up.d/your-service

Ubuntu / Upstart:

Ubuntu verwendet upstart als Sysvinit-Ersatz. Wenn Sie schauen /etc/network/if-up.d/ siehst du das upstart hat dort auch einen Haken gelegt. Dieser Haken ist die Basis der ausgearbeiteten upstart Mechanismus, der die Möglichkeit bietet, einen Dienst zu starten, wenn nicht eine bestimmte Netzwerkschnittstelle aufgerufen wurde. Der Emporkömmling-Haken löst das Ereignis aus net-device-up und übergibt die IFACE, LOGICAL, ADDRFAM und METHOD als Parameter. Sie verwenden diesen Hook im Upstart-Skript für Ihren Dienst (wie @Guy erwähnt):

start on net-device-up IFACE=eth0

14
2017-12-12 00:19



Wenn Sie unter Ubuntu sind, können Sie diese Frage mit einem Tag versehen Ubuntu Emporkömmling

Neben der großen Einfachheit wirst du auch in der Lage sein:

start on net-device-up IFACE=eth0

Für weitere Informationen siehe ganz Emporkömmling Kochbuch


3
2017-12-09 19:10