Jak napisać plik systemowej jednostki serwisowej, aby przed uruchomieniem czekał na określony interfejs?

14

Próbuję napisać plik jednostkowy dla hostapd na Debianie.

Wygląda na to, że demon hostapd potrzebuje interfejsu, aby powiązany interfejs Wi-Fi był uruchomiony przed jego uruchomieniem lub SEGV.

Próbowałem network-online.target, ale nadal otrzymuję SEGV. Myślę, że dzieje się tak, ponieważ network-online.target musi widzieć KAŻDY interfejs, a inne interfejsy pojawiają się, zanim interfejs Wi-Fi jest wystarczająco gotowy do działania hostapd.

Jaki jest najlepszy sposób, aby usługa czekała na uruchomienie określonego interfejsu przed uruchomieniem?

bigjosh
źródło

Odpowiedzi:

15

Od wersji systemd 219 można bezpośrednio używać systemd-networkd-wait-onlinenarzędzia systemd z --interfaceparametrem określającym interfejs, na który należy czekać. Na przykład:

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

Istnieje jednak zastrzeżenie. To narzędzie musi systemd-networkdbyć uruchomione, nawet jeśli nie robi nic w konfiguracji. Z drugiej strony, zaczynając od tego samego systemu 219, systemd-networkdmożna aktywować gniazdo i automatycznie wychodzi z trybu bezczynności. Więc wszystko, czego potrzebujesz, to włożyć wtyczkę do gniazdka.

Podsumowując, modyfikacje pliku jednostkowego będą wyglądać następująco (z $IFACEpodstawionym pożądanym interfejsem):

[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
źródło
1
Tak, właśnie tego chcę. Niestety utknąłem na Debianie 4.6.3 z systememd 44, więc nie mogę go używać. Wszelkie pomysły na to, jak sprawić, by działało na tej platformie? Dzięki!
bigjosh
2
@bigjosh, zawsze możesz zrobić coś takiego perl -e 'sleep 1 until -e "/sys/class/net/myinterface"'w swoim ExecStartPre
Stéphane Chazelas