升级到 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 依赖关系已得到满足。
最好在你的应用程序中包含一个测试。