为什么我的 systemd 服务不等待网络?

为什么我的 systemd 服务不等待网络?

问题及其答案,我已将以下内容添加到我的服务文件中:

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

第一步是确定您是否正在使用NetworkManagersystemd-networkdwait-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 或两者。

相关内容