Stavo riscontrando lo stesso problema, con uno script di backup userland che necessita dell'accesso a Internet. L'ho risolto aggiungendo ~/.config/systemd/user/wait-for-network.service
che esegue solo il ping di google.com
finché non è raggiungibile:
[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
Poi ho fatto dipendere il mio script di backup in questo modo:
[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service
Funziona indipendentemente dal fatto che tu usi NetworkManager
o qualche altro mezzo per stabilire la connessione.
Dimentica il network.target
. man systemd.special
dice:
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.
Quindi, questo obiettivo è principalmente un hack di compatibilità per gli script SysV init.
Supponendo che la tua connessione di rete sia gestita da NetworkManager, ovviamente avevi ragione a dipendere da questo target perché NetworkManager.service
definisce Before=network.target
. Ma questo significa solo che NetworkManager è stato avviato, non che la connessione di rete è effettivamente stabilita. Ciò potrebbe richiedere del tempo (dhcp roundtrip, wifi handshake, ecc.) ed è interamente compito di NetworkManager. Almeno sul mio sistema (F18) c'è un servizio chiamato NetworkManager-wait-online
. Usa nm-online
programma di utilità da bloccare finché non viene stabilita una connessione attiva. Prova a Require, Before
quello nella tua definizione di unità o usa quello strumento da solo.