为什么“ip route show”不会在我的脚本中从 systemd 服务产生任何输出

为什么“ip route show”不会在我的脚本中从 systemd 服务产生任何输出

服务..

[Unit]
Description=testing
Requires=network-online.target
After=NetworkManager.service

[Service]
SyslogIdentifier=testing
Type=oneshot
ExecStart=test.sh

[Install]
WantedBy=network-online.target

测试.sh...

#!/usr/bin/env bash
nmcli connection up router.wired
echo ***
nmcli connection show
echo ***
ip route show

输出..

testing[779]: Connection successfully activated (D-Bus active path: /org/freedesktop/Network>
testing[772]: ***
testing[1468]: NAME          UUID  TYPE      DEVICE
testing[1468]: router.wired  xxxx  ethernet  enp1s0
testing[1468]: router        xxxx  wifi      --
testing[772]: ***

ip route show尽管连接已建立,但为什么不显示任何输出。我如何才能在不调用nmcli connection up.

如果我从脚本中取出,nmcli connection up机器无论如何都会启动到该连接,此时我可以手动调用我的服务,并通过包含默认网关sudo service test start获得预期结果。ip route show

不满意的解决方案...

问题似乎是系统启动时的顺序,因为我尝试在启动时禁用我的服务,而是尝试使用定时器单元激活它,并且OnBootSec=50有效。我尝试了似乎所有可能的依赖关系network.targetnetwork-online.targetNetworkManager.service没有成功。

答案1

我的猜测是,ip route退出太快,systemd-journald 无法正确检测它属于哪个单元。检查全球的 journalctl -b看看它是否有你想要的输出。 (这是一个已知问题。)

另外,不过:

  1. Requires=并不意味着After=,因此您的服务实际上并不等待到达 network-online.target 。你需要明确地说After=network-online.target

    (如果依赖项出现,它确实意味着 After=目标,但在任何其他情况下都不是。)

  2. 默认情况下,network-online.target 实际上是空的 – 由您决定启用适当的“等待”服务,例如systemd-networkd-wait-online或 在您的情况下NetworkManager-wait-online。确保启用了后者,否则目标将不会执行任何操作。

  3. 你的另一方面,服务应该不是处于WantedBy=network-online.target.这不是目标的目的。

相关内容