Estaba teniendo el mismo problema, con un script de copia de seguridad de usuario que necesita acceso a Internet. Lo resolví agregando ~/.config/systemd/user/wait-for-network.service
eso solo hace ping google.com
hasta que sea accesible:
[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
Luego hice que mi secuencia de comandos de copia de seguridad dependiera de ella de esta manera:
[Unit]
Description=...
Requires=wait-for-network.service
After=wait-for-network.service
Esto funciona independientemente de si usa NetworkManager
o algún otro medio para establecer la conexión.
Olvida el 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.
Por lo tanto, este objetivo es principalmente un truco de compatibilidad para los scripts de inicio de SysV.
Asumiendo que su conexión de red es manejada por NetworkManager, por supuesto, tenía razón al depender de este objetivo porque NetworkManager.service
define Before=network.target
. Pero esto solo significa que se ha iniciado NetworkManager, no que la conexión de red se haya establecido realmente. Eso puede llevar un tiempo (ida y vuelta de dhcp, protocolo de enlace wifi, etc.) y es asunto exclusivo de NetworkManager. Al menos en mi sistema (F18) hay un servicio llamado NetworkManager-wait-online
. Utiliza el nm-online
programa de utilidad para bloquear hasta que haya una conexión activa establecida. Intenta Require, Before
eso en su definición de Unidad o use esa herramienta por sí sola.