如何编写systemd服务单元文件,以便它在启动之前一直等到特定接口启动?


14

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

hostapd守护程序似乎在运行或SEGV之前需要相关Wifi接口的接口。

我已经尝试过network-online.target,但仍然可以获得SEGV。我认为这是因为network-online.target仅需要查看ANY接口,并且在Wifi接口足以使hostapd正常工作之前,会启动其他接口。

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

Answers:


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

1
是的,这正是我想要的。不幸的是,我在systemd 44上停留在Debian 4.6.3上,所以不能使用它。关于如何使其在此平台上运行的任何想法?谢谢!
bigjosh 2015年

2
@bigjosh,你总是可以做这样的事情perl -e 'sleep 1 until -e "/sys/class/net/myinterface"'在你的ExecStartPre
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.