我有几个关于 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 安装默认都有这个目标。由于它是一个目标,因此它表明系统在启动过程中已达到特定的里程碑,而不是仅启动单个服务。如果这不起作用,请尝试与您知道需要网络连接的另一个服务单元进行比较。