每这问题及其答案,我已将以下内容添加到我的服务文件中:
Wants=network-online.target
After=docker.service network.target network-online.target
我也跑过:
systemctl enable NetworkManager-wait-online.service
systemd-networkd-wait-online.service
然而,由于连接问题,我ExecStartPre
使用的任务仍然失败。git pull origin master
Mar 22 16:17:21 COMPUTER git[1983]: ssh: Could not resolve hostname github.com: Name or service not known
Mar 22 16:17:21 COMPUTER git[1983]: fatal: Could not read from remote repository.
我错过了一些明显的东西吗?我需要等待其他服务才能使用吗git pull
? (如果相关的话,我使用的是 Ubuntu 16.10 和 systemd 231。)
答案1
第一步是确定您是否正在使用NetworkManager
或systemd-networkd
。wait-online
为您正在使用的启用(假设systemd-networkd
在此示例中):
systemctl enable systemd-networkd-wait-online.service
在服务结束后启动您的服务wait-online
:
[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service
(requires是一个更严格的变体wants
,在这种情况下,你似乎想要硬依赖)。
这应该会导致您的服务在网络保证启动后启动。
或者(或与之前的解决方案结合使用),您可以使用以下标志将服务配置为在失败时重新启动Restart=
:
[Service]
...
Restart=on-failure
RestartSec=5
https://www.freedesktop.org/software/systemd/man/systemd.service.html#Restart=
这可能是更好的方法,因为它不会减慢您的启动速度(https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/#cutthecraphowdoimakenetwork.targetworkforme- 使用wait-online
可能会大大减慢您的启动时间),但如果您担心服务失败时会做什么,请选择选项 1 或两者。