Systemd 在运行服务之前等待网络接口启动

Systemd 在运行服务之前等待网络接口启动

我有几个关于 systemd 的问题。一旦网络接口启动,我就无法始终让脚本运行。我已经尝试了 Requires 和 After ,如下所示,但与等待网络启动不一致。我是否使用了正确的服务并正确实施了它?为了绕过这个现在我正在运行一个 ping 检查循环,这是非常低效和黑客的。任何建议都会很棒。谢谢!

[Unit]
Description=PBU installer
Requires=network-online.service
After=network-online.service

[Service]
Type=oneshot
ExecStart=/home/pbu/current/scripts/pbu-unpack.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

答案1

我通过查看以下输出解决了这个问题:

systemctl list-units --no-pager

这向我展示了许多我没有想到的单位,就像所有的网络设备一样!

sys-devices-virtual-net-lan0.device loaded active plugged   /sys/devices/virtual/net/lan

所以我添加了

BindsTo=sys-devices-virtual-net-lan0.device
After=sys-devices-virtual-net-lan0.device

到我的单位服务文件,然后我的服务直到 lan0 可用才启动。

答案2

这似乎是不正确的。正确的名字是network-online.target. network-online.service不存在(在 Fedora 26 上测试)。

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

答案3

恢复旧线程,我希望某些人可能会觉得有用。我需要在 RPi 上的 nftables 上使用无线接口,有时需要很长时间才能连接。我补充道:

ExecStartPre=timeout 60s bash -c 'until ip a s dev wlan0; do sleep 1; done'

转至 nftables.service 单位以使其正常工作。除了ExecPreStart=sleep 60看起来有点愚蠢之外,这里的其他解决方案都没有可靠地工作。当接口启动时,循环until终止,但还没有 IP,因为我的 nft 规则不需要 IP。通过管道grep '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\/[0-9]\{1,2\}'将导致它等待 IPV4 地址。

答案4

你尝试过包括Requires=network-online.target吗?我的 Arch 和 CentOS 安装默认都有这个目标。由于它是一个目标,因此它表明系统在启动过程中已达到特定的里程碑,而不是仅启动单个服务。如果这不起作用,请尝试与您知道需要网络连接的另一个服务单元进行比较。

相关内容