J'avais le même problème, avec un script de sauvegarde userland nécessitant un accès à Internet. Je l'ai résolu en ajoutant ~/.config/systemd/user/wait-for-network.service
qui ping juste google.com
jusqu'à ce qu'il soit accessible :
[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
Ensuite, j'ai fait en dépendre mon script de sauvegarde comme ceci :
[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service
Cela fonctionne que vous utilisiez ou non NetworkManager
ou tout autre moyen d'établir la connexion.
Oubliez le network.target
. man systemd.special
dit :
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.
Donc, cette cible est principalement un hack de compatibilité pour les scripts d'initialisation SysV.
En supposant que votre connexion réseau est gérée par NetworkManager, vous aviez bien sûr raison de dépendre de cette cible car NetworkManager.service
définit Before=network.target
. Mais cela signifie seulement que NetworkManager a été démarré, pas que la connexion réseau est réellement établie. Cela peut prendre un certain temps (allers-retours DHCP, poignée de main wifi, etc.) et est entièrement l'affaire de NetworkManager. Au moins sur mon système (F18) il y a un service appelé NetworkManager-wait-online
. Il utilise le nm-online
programme utilitaire à bloquer jusqu'à ce qu'une connexion active soit établie. Essayez de Require, Before
cela dans votre définition d'unité ou utilisez cet outil seul.