Ich hatte das gleiche Problem mit einem Userland-Backup-Skript, das Zugriff auf das Internet benötigt. Ich habe es gelöst, indem ich ~/.config/systemd/user/wait-for-network.service
hinzugefügt habe das pingt nur google.com
bis es erreichbar ist:
[Unit]
Description=Ping a server on the internet until it becomes reachable
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'while ! ping -c1 google.com; do sleep 1; done'
TimeoutStartSec=60s
Dann habe ich mein Backup-Skript wie folgt davon abhängig gemacht:
[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service
Dies funktioniert unabhängig davon, ob Sie NetworkManager
verwenden oder ein anderes Mittel, um die Verbindung herzustellen.
Vergessen Sie die network.target
. man systemd.special
sagt:
network.target systemd automatically adds dependencies of type After for this target unit to all SysV init script service units with an LSB header referring to the $network facility.
Dieses Ziel ist also in erster Linie ein Kompatibilitäts-Hack für SysV-Init-Skripte.
Unter der Annahme, dass Ihre Netzwerkverbindung von NetworkManager verwaltet wird, haben Sie sich natürlich zu Recht auf dieses Ziel verlassen, da NetworkManager.service
definiert Before=network.target
. Dies bedeutet jedoch nur, dass der NetworkManager gestartet wurde, nicht dass die Netzwerkverbindung tatsächlich hergestellt wurde. Das kann eine Weile dauern (DHCP-Roundtrips, WLAN-Handshake usw.) und ist ausschließlich Sache von NetworkManager. Zumindest auf meinem System (F18) gibt es einen Dienst namens NetworkManager-wait-online
. Es verwendet den nm-online
Dienstprogramm zu blockieren, bis eine aktive Verbindung hergestellt ist. Versuchen Sie es mit Require, Before
das in Ihrer Unit-Definition oder verwenden Sie dieses Tool allein.