6

起動時に開始する /etc/init.d/ スクリプトがあり、ネットワークが必要です。私は rc start を 99 に設定しているので、最後に読み込まれますが、ネットワークはすぐには読み込まれず、ネットワークの読み込みを待つために現在 30 秒のスリープ コマンドに頼らなければなりません。

OS は組み込みシステム用に変更された Ubuntu です (Yocto Project)。ファイルシステムは同じですが、サービスが非常に限られているため、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
4

2 に答える 2

15

基本的な Debian の方法:

基本的/etc/network/if-up.dには、そのようなスクリプトの場所です。これらのスクリプトは、インターフェイスが Debian システムまたは派生物 (Ubuntu など) で起動したときに呼び出されます。ここでは、これらのスクリプトに渡される環境変数のリストを見つけることができます。これらの変数を使用して、起動するインターフェイスとインターフェイスの構成の詳細を決定できます。調べると、そのようなスクリプトの例が見つかる場合があります/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

する必要があることに注意してください

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

Ubuntu / アップスタート:

Ubuntu はupstartsysvinit の代替として使用しています。調べていると、そこにもフックが配置されている/etc/network/if-up.d/ことがわかります。upstartこのフックは、upstart特定のネットワーク インターフェイスが起動されていない限り、サービスを開始する可能性を提供する、より精巧なメカニズムのベースです。upstart フックはイベントをトリガーし、 、、およびをパラメーターとしてnet-device-up渡します。サービスのupstartスクリプトでこのフックを使用します(@Guyが言及したように):IFACELOGICALADDRFAMMETHOD

start on net-device-up IFACE=eth0
于 2013-12-12T00:19:53.707 に答える
3

Ubuntu を使用している場合は、この質問にタグが付けられているため、Ubuntu upstartの使用を検討してください。

非常にシンプルなだけでなく、次のこともできます。

start on net-device-up IFACE=eth0

詳細については、新興クックブック全体を参照してください

于 2013-12-09T19:10:03.567 に答える