¿Cómo escribir un archivo de unidad de servicio systemd para que espere hasta que una interfaz específica esté activa antes de comenzar?

14

Estoy tratando de escribir un archivo de unidad para hostapd en Debian.

El demonio hostapd parece necesitar la interfaz para que la interfaz Wifi asociada esté activa antes de que se ejecute o, de lo contrario, es SEGV.

Intenté network-online.target, pero aún obtengo el SEGV. Creo que esto se debe a que network-online.target solo necesita ver CUALQUIER interfaz, y otras interfaces aparecen antes de que la interfaz Wifi esté lo suficientemente lista para que hostapd funcione.

¿Cuál es la mejor manera de hacer que un servicio espere a que una interfaz específica esté activa antes de comenzar?

bigjosh
fuente

Respuestas:

15

Desde systemd 219, puede usar la systemd-networkd-wait-onlineherramienta de systemd directamente, con un --interfaceparámetro para especificar la interfaz a esperar. Por ejemplo:

ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE

Sin embargo, hay una advertencia. Esta herramienta debe systemd-networkdestar ejecutándose, incluso si no hace nada en su configuración. Por otro lado, comenzando con el mismo systemd 219, systemd-networkdes activable por socket y se cierra automáticamente en inactivo. Entonces, todo lo que necesita es jalarlo.

En conjunto, las modificaciones al archivo de la unidad se verán así (con $IFACEsustituido por la interfaz deseada):

[Unit]
Requires=systemd-networkd.socket
After=systemd-networkd.socket
...

[Service]
ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE
ExecStart=/usr/bin/hostapd ...
...
intelfx
fuente
1
Sí, esto es exactamente lo que quiero. Desafortunadamente, estoy atascado en Debian 4.6.3 con systemd 44, así que no puedo usarlo. ¿Alguna idea sobre cómo hacer que funcione en esta plataforma? ¡Gracias!
bigjosh
2
@bigjosh, siempre puedes hacer algo como perl -e 'sleep 1 until -e "/sys/class/net/myinterface"'en tu ExecStartPre
Stéphane Chazelas