Как написать файл системного модуля systemd, чтобы он ожидал, пока не запустится определенный интерфейс, прежде чем запускать?

14

Я пытаюсь написать файл модуля для hostapd на Debian.

Демон hostapd, кажется, нуждается в интерфейсе для связанного интерфейса Wi-Fi, чтобы быть запущенным, прежде чем он будет запущен, или же это SEGV.

Я пробовал network-online.target, но все еще получаю SEGV. Я думаю, это потому, что network-online.target должен видеть только ЛЮБОЙ интерфейс, а другие интерфейсы появляются до того, как интерфейс Wifi будет достаточно готов для работы hostapd.

Как лучше всего подождать, пока служба запустит определенный интерфейс перед запуском?

bigjosh
источник

Ответы:

15

Начиная с systemd 219, вы можете использовать systemd-networkd-wait-onlineинструмент systemd напрямую, с --interfaceпараметром для указания интерфейса, который следует ожидать. Например:

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

Однако есть одна оговорка. Этот инструмент должен systemd-networkdбыть запущен, даже если он ничего не делает в вашей конфигурации. С другой стороны, начиная с того же systemd 219, systemd-networkdон активируется через сокет и автоматически выходит из режима ожидания. Так что все, что вам нужно, это вытащить его из розетки.

Собрав все это вместе, изменения в модульном файле будут выглядеть следующим образом (с $IFACEзаменой на желаемый интерфейс):

[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
источник
1
Да, это именно то, что я хочу. К сожалению, я застрял на Debian 4.6.3 с systemd 44, поэтому не могу его использовать. Любые идеи о том, как заставить его работать на этой платформе? Благодарность!
bigjosh
2
@bigjosh, вы всегда можете сделать что-то подобное perl -e 'sleep 1 until -e "/sys/class/net/myinterface"'в вашем ExecStartPre
Стефан