服务..
[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.target
,network-online.target
但NetworkManager.service
没有成功。
答案1
我的猜测是,ip route
退出太快,systemd-journald 无法正确检测它属于哪个单元。检查全球的 journalctl -b
看看它是否有你想要的输出。 (这是一个已知问题。)
另外,不过:
Requires=
并不意味着After=
,因此您的服务实际上并不等待到达 network-online.target 。你需要明确地说After=network-online.target
。(如果依赖项出现,它确实意味着 After=从目标,但在任何其他情况下都不是。)
默认情况下,network-online.target 实际上是空的 – 由您决定启用适当的“等待”服务,例如
systemd-networkd-wait-online
或 在您的情况下NetworkManager-wait-online
。确保启用了后者,否则目标将不会执行任何操作。你的另一方面,服务应该不是处于
WantedBy=network-online.target
.这不是目标的目的。