Como gravar um arquivo de unidade de serviço systemd para que ele aguarde até que uma interface específica seja ativada antes de iniciar?

14

Estou tentando escrever um arquivo de unidade para o hostapd no Debian.

O daemon hostapd parece precisar da interface para que a interface Wifi associada esteja ativa antes de ser executada ou então dos SEGVs.

Eu tentei network-online.target, mas ainda recebo o SEGV. Eu acho que isso ocorre porque o network-online.target precisa ver QUALQUER interface, e outras interfaces surgem antes que a interface Wifi esteja pronta o suficiente para o hostapd funcionar.

Qual é a melhor maneira de ter um serviço esperando que uma interface específica seja instalada antes de iniciar?

bigjosh
fonte

Respostas:

15

Desde systemd 219, você pode usar a systemd-networkd-wait-onlineferramenta systemd diretamente, com um --interfaceparâmetro para especificar a interface a aguardar. Por exemplo:

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

No entanto, há uma ressalva. Essa ferramenta precisa systemd-networkdestar em execução, mesmo que não faça nada na sua configuração. Por outro lado, começando com o mesmo systemd 219, systemd-networkdé ativável por soquete e sai automaticamente no modo inativo. Então, tudo o que você precisa é inserir o soquete.

Juntando tudo, as modificações no arquivo de unidade terão a seguinte aparência ( $IFACEsubstituídas pela interface desejada):

[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
fonte
1
Sim, é exatamente isso que eu quero. Infelizmente estou preso no Debian 4.6.3 com o systemd 44, portanto não posso usá-lo. Alguma idéia de como fazê-lo funcionar nesta plataforma? Obrigado!
bigjosh
2
@bigjosh, você sempre pode fazer algo assim perl -e 'sleep 1 until -e "/sys/class/net/myinterface"'em sua ExecStartPre
Stéphane Chazelas