Comment écrire un fichier d'unité de service systemd pour qu'il attende qu'une interface spécifique soit active avant de démarrer?

14

J'essaie d'écrire un fichier d'unité pour hostapd sur Debian.

Le démon hostapd semble avoir besoin de l'interface pour que l'interface Wifi associée soit active avant qu'elle ne soit exécutée, sinon elle est SEGV.

J'ai essayé network-online.target, mais j'obtiens toujours le SEGV. Je pense que c'est parce que network-online.target n'a besoin que de voir TOUTE interface, et d'autres interfaces apparaissent avant que l'interface Wifi soit suffisamment prête pour que hostapd fonctionne.

Quelle est la meilleure façon de faire attendre un service pour qu'une interface spécifique soit active avant de démarrer?

bigjosh
la source

Réponses:

15

Depuis systemd 219, vous pouvez utiliser systemd-networkd-wait-onlinedirectement l'outil de systemd , avec un --interfaceparamètre pour spécifier l'interface à attendre. Par exemple:

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

Cependant, il y a une mise en garde. Cet outil doit systemd-networkdêtre en cours d'exécution, même s'il ne fait rien dans votre configuration. D'un autre côté, à partir du même systemd 219, il systemd-networkdest activable par socket et se ferme automatiquement au repos. Donc, tout ce dont vous avez besoin est de retirer sa prise.

En mettant tout cela ensemble, les modifications apportées au fichier d'unité ressembleront à ceci (avec $IFACEsubstitué avec votre interface souhaitée):

[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
la source
1
Oui, c'est exactement ce que je veux. Malheureusement, je suis bloqué sur Debian 4.6.3 avec systemd 44, donc je ne peux pas l'utiliser. Des idées sur la façon de le faire fonctionner sur cette plateforme? Merci!
bigjosh
2
@bigjosh, vous pouvez toujours faire quelque chose comme perl -e 'sleep 1 until -e "/sys/class/net/myinterface"'dans votre ExecStartPre
Stéphane Chazelas