2013-12-09 51 views
5

我有一個啓動時啓動的/etc/init.d/腳本,需要聯網才能使用。我將rc start設置爲99,所以這是加載的最後一件事情,但網絡不會立即加載,我目前不得不依賴30秒的睡眠命令來等待網絡加載。如何檢測/etc/init.d腳本中的網絡初始化時間?

操作系統是針對嵌入式系統(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 
+0

這個帖子被標記'ubuntu'但看起來像RHEL一個SysVinit的腳本。 – jordanm

+0

這是一個嵌入式系統,它有一個Ubuntu(Yocto項目)的修改版本。爲了簡單起見,我將描述文字格式化爲RH,但實際上並不適用於RH。 – BayssMekanique

回答

13

基本的Debian方式

基本上/etc/network/if-up.d是這樣的腳本的地方。當一個接口在Debian系統或派生版上運行時,就會調用這些腳本 - 比如Ubuntu。在這裏您可以找到傳遞給這些腳本的環境變量列表。通過使用這些變量,您可以決定啓動哪個接口以及接口配置的詳細信息。尋找到/etc/network/if-up.d

當樣本腳本可能看起來像這樣你會發現這樣的scipts的例子(來自桑巴包的。只是爲了解釋事情是如何工作的。如果你正在使用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 

注意,你需要

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

的Ubuntu /新貴

Ubuntu是使用upstart作爲sysvinit的更換。如果你正在調查/etc/network/if-up.d/,你會發現upstart也在那裏。這個鉤子是更詳盡的upstart機制的基礎,它提供了啓動服務的可能性,除非某個網絡接口已經被提出。新貴鉤子將觸發事件net-device-up並通過IFACELOGICAL,ADDRFAMMETHOD作爲參數。您可以使用此掛鉤的新貴腳本爲您服務(如@Guy提到):

start on net-device-up IFACE=eth0 
3

,如果你是在Ubuntu,因爲這個問題被標記,可以考慮使用Ubuntu upstart

偉大簡單的旁邊你也可以於:

start on net-device-up IFACE=eth0 

更多信息請參見整個upstart cookbook