Estoy tratando de crear un servicio systemd en Debian Jessie. Lo necesito para comenzar después de que network-online.target
se alcanza.
El problema son los network-online.target
incendios al mismo tiempo network.target
y en ese momento mis interfaces no están configuradas todavía, solo comencé la consulta DHCP.
Parece que este problema es específico de Debian porque usa la configuración de red heredada.
¿Cómo evitar este problema o cómo hacer que network-online.target
funcione?
debian
systemd
systemd-networkd
10robinho
fuente
fuente
systemctl list-dependencies network-online.target
? Además, tenga en cuenta quenetwork-online.target
puede no necesariamente significar que hay acceso a Internet. Vea esta página para más información.network-online.target ● └─systemd-networkd-wait-online.service
ya he leído esa página, entiendo el concepto básico allí, pero aún así es muy extraño no tener un punto definido donde puedan comenzar los servicios críticos de la red. Al menos podría esperar la asignación adecuada de DHCP.network-online.target
depende solo delsystemd-networkd-wait-online.service
dicho de que está listo. No depende de que NetworkManager diga que está listo, ni compruebe queifup
todos los enlaces se hayan activado correctamente (si usa ese método para configurar su red). Ubuntu, por otro lado, depende deifup
NetworkManager, pero no parasystemd-networkd-wait-online.
./etc/network/interfaces
,.network
archivos systemd o NetworkManager?network-online.target
ynetwork.target
se activan justo despuésifup
. Yo uso debian default, así que/etc/network/interfaces
con la dirección dhcp. Parece que networkd podría ser una mejor solución, pero no es fácil de implementar.Respuestas:
Como está utilizando
/etc/network/interfaces
, necesitará un servicio systemd para monitorear el estado de cada interfaz. Verifique si tiene/lib/systemd/system/ifup-wait-all-auto.service
(instalado por elifupdown
paquete en Ubuntu 15.04). Si no, cree/etc/systemd/system/ifup-wait-all-auto.service
y pegue lo siguiente:Este es el archivo de servicio presente en un sistema Ubuntu 15.04, pero con la
[Install]
sección agregada para facilitar un poco las cosas. Espero que el comportamiento deifup
Ubuntu 15.04 sea el mismo que el deifup
Debian Jessie. De lo contrario, será necesaria alguna modificación (particularmente con la última línea).Entonces, corre
sudo systemctl enable ifup-wait-all-auto.service
. Después de reiniciar su computadora, debería ver quenetwork-online.target
se alcanza después de abrir las interfaces (al menos).fuente
ExecStart = /bin/bash -c 'while [ -z "$(hostname -I)" ]; do sleep 1; done;'
. Dependehostname
de verificar si se ha asignado la dirección IP.ifup-wait-all-auto.service
se ha descartado en laifupdown
versión0.8.5ubuntu1
: "Descartar ifup-wait-all-auto.service. Esto se ha implementado de manera más elegante haciendo¡Atención! Lo descubrí en un Raspbian Jessie: elimina TODAS las líneas comentadas en / etc / interfaces de red y ¡funcionará! Parece ser un error de análisis =) En mi caso específico, lo dejé comentado
iface eth0 inet dhcp
y lo olvidé hace eones, pero después de actualizar a Raspbian Jessie y reconstruir un núcleo, tuve un comportamiento muy extraño: usé DHCP y me negué a hacerlo. realice un ajuste desde / etc / network / interfaces. Así que lo eliminé de cualquier comentario, solo líneas de trabajo, reinicio, ¡y funciona! NO SE NECESITA PATCHING / EDICIÓN DE SCRIPT!fuente
/etc/network/interfaces
archivo; se activará si todavía está allí.De acuerdo con https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/, la forma recomendada de iniciar un servicio DESPUÉS de la conexión de redes es nivelar es usar " network-online.target " en el archivo .service :
Sin embargo, después de usar " network-online.target " y mi servicio fallaba porque la red no estaba completamente nivelada, descubrí que hay un error ( https://github.com/coreos/bugs/issues/1966 ) con él: no se garantiza que ser 100% infalible
De hecho, cuando se utilizan herramientas de configuración de redes dinámicas como " NetworkManager " como en este caso, el estado de las redes nunca puede ser 100% preciso o predecible. Aparentemente, desde el enlace que describe el error, " network-online.target " puede comportarse de manera inconsistente dependiendo de las diferentes aplicaciones con las que se utiliza.
Solución alternativa :
debe analizar el orden de inicio de los servicios y utilizar uno que comience más tarde que " network-online.target ":
Este es un proceso iterativo que cambia los objetivos de forma incremental a servicios posteriores y posteriores hasta que encuentre el que garantice que la red esté nivelada y su servicio se inicie sin errores. En mi propio caso, incluso tuve que poner
sleep 10
en mi script el servicio SystemD llamado.fuente
Una vez encontré una respuesta en Github que la resolvió intentando continuamente hacer ping a un servidor. Solo cuando llega el ping, el servicio continúa:
Lo reemplacé
google.com
con mi propio servidor porque mi script principal necesitaba conectarse a mi servidor.fuente