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

pdo*_*926 10 networking systemd

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

Wants=network-online.target
After=docker.service network.target network-online.target
Run Code Online (Sandbox Code Playgroud)

我也跑了:

systemctl enable NetworkManager-wait-online.service
systemd-networkd-wait-online.service
Run Code Online (Sandbox Code Playgroud)

然而ExecStartPregit 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.
Run Code Online (Sandbox Code Playgroud)

我错过了一些明显的东西吗?我是否需要等待其他服务才能使用git pull?(如果相关,我使用的是 Ubuntu 16.10 和 systemd 231。)

Cen*_*ane 9

第一步是确定您是否使用NetworkManagersystemd-networkd。启用wait-online您正在使用的(假设systemd-networkd本示例):

systemctl enable systemd-networkd-wait-online.service
Run Code Online (Sandbox Code Playgroud)

在服务之后启动您的wait-online服务:

[Unit]
...
After=systemd-networkd-wait-online.service
Requires=systemd-networkd-wait-online.service
Run Code Online (Sandbox Code Playgroud)

(requires 是 更严格的变体wants,在这种情况下,您似乎想要硬依赖)。

这应该会导致您的服务在网络得到保证后启动。


或者(或结合之前的解决方案),您可以使用以下Restart=标志将服务配置为在失败时重新启动:

[Service]
...
Restart=on-failure
RestartSec=5
Run Code Online (Sandbox Code Playgroud)

https://www.freedesktop.org/software/systemd/man/systemd.service.html#Restart=

这可能是更好的方法,因为它不会减慢您的启动速度(https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/#cutthecraphowdoimakenetwork.targetworkforme - 使用wait-online可能会大大减慢您的启动时间),但是如果您担心服务在失败时可能会做什么,请选择选项 1 或两者兼而有之。