Wie kann ich ein systemd-Skript so einstellen, dass es lange genug wartet, um eine Verbindung zum Internet zu prüfen?

Wie kann ich ein systemd-Skript so einstellen, dass es lange genug wartet, um eine Verbindung zum Internet zu prüfen?

Ich habe ein Skript, das ich in einen einmaligen systemd-Dienst umgewandelt habe. Dieser läuft auf einem Raspberry Pi und der Sinn besteht darin, dass er, wenn er keine Verbindung zum Internet herstellen kann, den WLAN-Adapter (?) neu konfiguriert, um ein Ad-hoc-Netzwerk zu erstellen und neu zu starten.

Mein Problem besteht darin, dass bei der Überprüfung noch keine IP-Adresse empfangen wurde und ich deshalb denke, dass keine Verbindung hergestellt werden kann.

Ich habe versucht, den After=Parameter „be“ zu verwenden network-online.target, aber das hat nichts geändert. Außerdem habe ich versucht, einen sleepBefehl in das Skript selbst einzuführen, aber auch hier hat sich nichts geändert.

Irgendwelche Ideen?

Dies ist das Skript 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

BEARBEITEN

Das von mir verwendete Betriebssystem ist:Linux raspberrypi 4.1.7+ #817 PREEMPT Sat Sep 19 15:25:36 BST 2015 armv6l GNU/Linux

Antwort1

Eine Lösung wäre, das ifupdownPaket auf eine höhere Version (>= 0.8.9) zu aktualisieren, indem man die Debian-Backports verwendet (ichdenkendas sollte auf raspberian funktionieren), schau mal hierhttps://backports.debian.org/Instructions/. Anschließend müssen Sie das Paket aktualisieren ifupdown.

Was hier passiert, ist, dass der network-online.targetkeinen Dienst zieht und das bedeutet, dass er als „gestartet“ gilt, ohne tatsächlich auf etwas zu warten. Mit der neueren Version der ifupdownDatei networking.service, die die folgenden Zeilen enthält, bedeutet dies, dass der warten muss, network-online.targetbis er vollständig gestartet ist:

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

EDIT: Eine andere Möglichkeit wäre, After=networking.servicestattdessen

verwandte Informationen