Как я могу задержать сигнал Upstart-net-device-up, пока условие не будет выполнено?

Мне нужно подождать, пока будет выполнено определенное условие, сетевой интерфейс считается «активным». Upstart посылает свой сигнал net-device-up до того, как будет выполнено это условие, что приводит к сбою сценариев, зависящих от этого условия. Как мне задержать сигнал Upstart о подключении к сетевому устройству, пока не будет выполнено условие?

1
задан 30 September 2012 в 05:38

1 ответ

Одно из решений заключается в том, чтобы поместить в /etc/network/if-up.d/ сценарий, который выполняется перед любым другим сценарием if-up.d и ожидает выполнения определенного условия или истечения времени ожидания. Например, вот скрипт для ожидания неликального локального IPv6-адреса на интерфейсе IPv6, настроенного с помощью метода «auto»:

#!/bin/sh

LOG_FILE="/tmp/autoipv6.log"

if [ "$ADDRFAM" = "inet6" -a "$METHOD" = "auto" ]; then
        echo "Auto method detected, waiting for IP address" >> $LOG_FILE

        #wait until we have an IP address, or a timeout occurs
        TIMEOUT=50 #5 second timeout--each iteration sleeps for 1/10th of a second
        #get the number of addresses, excluding link-local addresses
        ADDRESS_COUNT=`ip addr show dev eth0 | grep inet6 | grep -v fe80 | wc -l`

        until [ $TIMEOUT -eq 0 ]; do
                NEW_ADDRESS_COUNT=`ip addr show dev eth0 | grep inet6 | grep -v fe80 | wc -l`

                # break out of the loop if more IPv6 addresses have been assigned
                # this is implementation is naive: no guarantee is given that the new addresses
                # are the result of the autoconfiguration request
                if [ "$NEW_ADDRESS_COUNT" -gt "$ADDRESS_COUNT" ]; then
                        echo "Detected new IP address, exiting" >> $LOG_FILE
                        ifconfig >> $LOG_FILE
                        exit 0;
                fi

                TIMEOUT=$((TIMEOUT-1))
                sleep .1
        done

        echo "Timeout waiting for IP address" >> $LOG_FILE
        exit 1;
fi

Важно, чтобы этот скрипт «ожидание условия» выполнялся до запускается сценарий Upstart if-up.d (в сценарии Upstart if-up.d генерируются сигналы net-device-up). Скрипты if-up.d выполняются run-parts в лексическом порядке сортировки (в том же порядке, что и вывод по умолчанию команды ls), поэтому простой способ гарантировать порядок - дать имя сценарию " 000wait-в-состоянии».

0
ответ дан 30 September 2012 в 05:38

Другие вопросы по тегам:

Похожие вопросы: