Uma solução é colocar um script em /etc/network/if-up.d/
que é executado antes de qualquer outro script if-up.d e espera que uma condição específica seja atendida ou que ocorra um tempo limite. Por exemplo, aqui está um script para aguardar um endereço IPv6 não vinculado ao local em uma interface IPv6 configurada com o método "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
É importante que este script "wait-for-condition" seja executado antes do script if-up.d Upstart executado (o script Upstart if-up.d é onde os sinais net-device-up
são gerados ). Os scripts if-up.d são executados por run-parts na ordem de classificação lexical ( na mesma ordem que a saída padrão do comando ls), então uma técnica simples para garantir a ordem é nomear o script "000wait-for-condition".