如何编写systemd服务以保证在dns服务之后启动?

如何编写systemd服务以保证在dns服务之后启动?

升级到 Kubuntu 19.04 后,我不知道如何编写服务以便它可以在 DNS 服务初始化后启动。

过去,我只是使用After=network.target,但现在不起作用。我也尝试过After=network-online.target,但没有成功。

所以我认为问题是systemd-resolved,我该如何解决这个问题?


更新:

ERROR: getaddrinfo: Temporary failure in name resolution
ERROR: failed to resolve the provided hostname

这是两个相关日志。所以我可以确认问题与 DNS 服务有关。

答案1

请在您的服务文件中添加依赖项:

After=nss-lookup.target

这应该确保主机/名称查找可操作。

更多详细信息请参阅文档: https://www.freedesktop.org/software/systemd/man/systemd.special.html

nss-lookup.target

应用作所有主机/网络名称服务查找的同步点的目标。请注意,这与应使用 nss-user-lookup.target 的 UNIX 用户/组名称查找无关。所有需要完整主机/网络名称解析的服务都应排在此目标之后,但不要将其拉入。systemd 会自动将此目标单元的 After= 类型的依赖项添加到所有 SysV init 脚本服务单元,并使用引用“$named”设施的 LSB 标头。

要充分等待网络,systemd 的文档https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/指导您添加到您的服务中:

After=network-online.target
Wants=network-online.target

并确认相关的“等待”服务已启用:

$ systemctl is-enabled NetworkManager-wait-online.service systemd-networkd-wait-online.service
disabled
enabled

答案2

请参阅本文末尾的单元文件... https://systemd.io/NETWORK_ONLINE/

换句话说,为了延迟到您的系统可以解析 DNS,您需要为 network-online 创建一个新依赖单元,该单元实际上会测试名称解析。如果系统暂停,这将不起作用,因为在暂停之前 network-online.target 依赖关系已得到满足。

最好在你的应用程序中包含一个测试。

相关内容