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



我有一个/etc/init.d/脚本,该脚本在启动时启动,需要建立网络。我的rc启动设置为99,所以这是最后加载的东西,但网络不会立即加载,我目前不得不依靠30秒的睡眠命令来等待网络加载。

操作系统是为嵌入式系统(Yocto项目)修改的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

Debian的基本方法

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

一个示例脚本可能是这样的(源自samba包。只是为了解释它是如何工作的。如果你使用的是Ubuntu,你应该使用upstart,稍后会解释)

/etc/network/if-up.d/您的服务

#!/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

注意您需要

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

Ubuntu/Upstart:

Ubuntu正在使用upstart作为sysvinit的替代品。如果你观察/etc/network/if-up.d/,你会发现upstart也在那里放置了一个钩子。这个钩子是更详细的upstart机制的基础,该机制提供了启动服务的可能性,除非已经提出了特定的网络接口。暴发户钩子将触发事件net-device-up,并传递IFACELOGICALADDRFAMMETHOD作为参数。你在你的服务的新贵脚本中使用这个钩子(就像上面提到的@Guy):

start on net-device-up IFACE=eth0

如果你在Ubuntu上,正如这个问题被标记的那样,考虑使用Ubuntu新贵

除了非常简单之外,您还可以:

start on net-device-up IFACE=eth0

有关更多信息,请参阅整个新贵食谱

最新更新