Debian systemd network-online.target 不工作?

Debian systemd network-online.target 不工作?

我正在尝试在 Debian Jessie 上创建 systemd 服务。我需要它在network-online.target到达后启动。

问题是network-online.target同时触发的,network.target当时我的接口尚未配置,刚刚开始 DHCP 查询。

看起来这个问题是 Debian 特有的,因为它使用旧的网络配置。

如何绕过这个问题或如何使其network-online.target工作?

答案1

由于您使用的是/etc/network/interfaces,因此您需要一个 systemd 服务来监视每个接口的状态。检查一下是否有(在 Ubuntu 15.04 中/lib/systemd/system/ifup-wait-all-auto.service通过软件包安装)。ifupdown如果没有,则创建/etc/systemd/system/ifup-wait-all-auto.service并粘贴以下内容:

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

这是 Ubuntu 15.04 系统上存在的服务文件,但[Install]添加了 部分以使事情变得更容易一些。我希望 Ubuntu 15.04 中的行为与Debian Jessie 中ifup的行为相同。ifup如果没有,则需要进行一些修改(特别是最后一行)。

然后,运行sudo systemctl enable ifup-wait-all-auto.service。重新启动计算机后,您应该会看到network-online.target在启动接口后(至少)达到了 。

答案2

我曾经发现Github 上的答案通过不断尝试 ping 服务器解决了这个问题。只有当 ping 通时,服务才会继续:

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

我替换google.com为我自己的服务器,因为我的主脚本需要连接到我的服务器。

答案3

注意力!刚刚在 Raspbian Jessie 上想通了:删除 /etc/network 接口中的所有注释行,它就会起作用!这似乎是一个解析错误 =) 在我的具体情况下,我留下了评论,iface eth0 inet dhcp并且在很久以前就忘记了它,但是在升级到 Raspbian Jessie 并重建内核后,我得到了非常奇怪的行为:它使用 DHCP 并拒绝从 /etc/network/interfaces 进行调整。所以我已经删除了它的任何注释 - 只是工作线,重新启动 - 它可以工作!无需脚本修补/编辑!

答案4

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/启动服务的推荐方式网络是水平是使用“网络在线.target“ 在里面。服务文件:

 "After=network-online.target"
 "Wants=network-online.target"

然而使用“网络在线.target“由于网络不完全水平,我的服务失败了,我发现有一个错误(https://github.com/coreos/bugs/issues/1966)与它:不保证100%正确。

事实上,动态网络配置工具如“网络管理器“在这种情况下使用,网络状态永远不可能 100% 精确或可预测。显然从描述错误的链接来看,”网络在线.target" 根据所使用的不同应用程序,其行为可能会不一致。

解决方法
您需要分析服务的启动顺序并使用晚于“启动的服务”网络在线.target”:

 systemd-analyze plot > /home/pi/graph.svg

这是一个迭代过程,逐步将目标更改为越来越晚的服务,直到找到确保网络水平且服务启动无错误的目标。就我自己而言,我什至必须sleep 10在我的脚本中添加 SystemD 服务调用的内容。

相关内容