如何检测在/etc/init.d脚本中初始化网络的时间?

Bay*_*que 5 bash shell ubuntu init.d rc

我有一个/etc/init.d/脚本,它在启动时启动,需要联网才能到位.我将rc start设置为99,所以这是加载的最后一件事,但是网络没有立即加载,我现在不得不依赖30秒的睡眠命令来等待网络加载.

操作系统是针对嵌入式系统(Yocto Project)修改的Ubuntu.文件系统是相同的,但服务非常有限,所以它使用Sysvinit.

有没有办法检查所有网络是否已完成加载?

这是脚本,如果有帮助:

#!/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
Run Code Online (Sandbox Code Playgroud)

hek*_*mgl 14

基本的Debian方式:

基本上/etc/network/if-up.d是这样的脚本的地方.当接口在Debian系统或衍生系统上运行时,就会调用这些脚本 - 比如Ubuntu.在这里,您可以找到传递给这些脚本的环境变量列表.使用这些变量,您可以决定哪个接口启动以及接口配置的详细信息.在查看时,您可能会找到此类scipts的示例/etc/network/if-up.d

示例脚本可能看起来像这样(从samba包派生.只是为了解释事情是如何工作的.如果您使用的是Ubuntu,您应该使用upstart稍后会解释)

/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
Run Code Online (Sandbox Code Playgroud)

请注意,您需要

chmod +x /etc/network/if-up.d/your-service
Run Code Online (Sandbox Code Playgroud)

Ubuntu/Upstart:

Ubuntu正在upstart用作sysvinit替代品.如果你正在调查,/etc/network/if-up.d/你会看到它upstart也有一个钩子.这个钩子是更精细upstart机制的基础,它提供了启动服务的可能性,除非已经启动某个网络接口.暴发户钩子将触发事件net-device-up,并传递IFACE,LOGICAL,ADDRFAMMETHOD作为参数.您可以在服务的upstart脚本中使用此挂钩(如提到的@Guy):

start on net-device-up IFACE=eth0
Run Code Online (Sandbox Code Playgroud)