如何编写 systemd 服务单元文件,以便它等到特定接口启动后再启动?

如何编写 systemd 服务单元文件,以便它等到特定接口启动后再启动?

我正在尝试为 Debian 上的 hostapd 编写一个单元文件。

hostapd 守护进程似乎需要在运行之前启动关联 Wifi 接口的接口,否则将使用 SEGV。

我已经尝试过network-online.target,但仍然得到SEGV。我认为这是因为 network-online.target 只需要查看任何接口,并且在 Wifi 接口准备好让 hostapd 正常工作之前其他接口就会出现。

让服务在启动之前等待特定接口启动的最佳方法是什么?

答案1

从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 ...
...

相关内容