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