Como posso fazer com que um script do systemd espere o suficiente para verificar uma conexão com a internet?

Como posso fazer com que um script do systemd espere o suficiente para verificar uma conexão com a internet?

Eu tenho um script que transformei em um serviço systemd oneshot. Isso é executado em um Raspberry Pi e a questão é que, se ele não conseguir se conectar à Internet, ele reconfigurará o adaptador wifi (?) Para criar uma rede ad hoc e reinicializar.

O problema que estou enfrentando é que quando ele verifica ainda não recebeu um endereço IP e, portanto, pensa que não consegue se conectar.

Tentei usar o After=parâmetro to be network-online.target, mas isso não mudou nada e tentei introduzir um sleepcomando no próprio script, mas novamente sem alteração.

Alguma ideia?

Este é o roteiro check_connection.sh:

INTERFACE_NAME=$(iwconfig 2>/dev/null | grep -o "^\w*")

sleep 5;

if ifconfig $INTERFACE_NAME | grep -q "inet addr"
then
    echo 'connected'
    # if connected check if it's ad hoc mode or not
    if iwconfig $INTERFACE_NAME | grep -q "Mode:Ad-Hoc"
    then
        echo 'start dhcp server'
        # if running in ad hoc mode make sure server starts
        sudo service isc-dhcp-server start
    fi
else
    echo 'not connected'
    # if not connected switch settings to ad hoc and reboot
    sudo cp /etc/network/interfaces-adhoc /etc/network/interfaces
    sudo reboot
fi

/etc/systemd/system/check_connection.service:

[Unit]
Description=Check whether connected at startup
After=network-online.target

[Service]
User=root
ExecStart=/bin/bash /home/pi/check_connection.sh

[Install]
WantedBy=multi-user.target

EDITAR

O sistema operacional que estou executando é:Linux raspberrypi 4.1.7+ #817 PREEMPT Sat Sep 19 15:25:36 BST 2015 armv6l GNU/Linux

Responder1

Uma das soluções seria atualizar o ifupdownpacote para uma versão superior (>= 0.8.9) usando os backports debian (Ipensarisso deve funcionar no raspberian), dê uma olhada emhttps://backports.debian.org/Instructions/. Você então precisa atualizar o ifupdownpacote.

O que está acontecendo aqui é que network-online.targetnão está puxando nenhum serviço e isso significa que ele é considerado "iniciado" sem realmente esperar por nada. Com a versão mais recente do ifupdownarquivo networking.servicecontém as seguintes linhas, o que significa que fará com que o programa network-online.targetespere até que seja totalmente iniciado:

[Install]
WantedBy=multi-user.target
WantedBy=network-online.target

EDIT: Uma outra opção poderia ser usar o After=networking.serviceem vez disso

informação relacionada