Systemd - 只有在 DNS 可用后才启动服务

Bra*_*o__ 5 domain-name-system nginx powerdns systemd

我有几个服务,最显着的是 nginx 和 ntpd,它们依赖于有效的 DNS 解析才能正常启动。现在,这些服务都没有在启动时正确启动,但在机器启动后手动干预时确实启动良好,日志中的一些消息是关于无法解析名称的。

这让我相信我与 systemd 存在竞争条件。我的服务器指向 127.0.0.1 作为其名称服务器。绑定到 localhost:53 的是 pdns-recursor。我已经将 ntp 和 nginx 设置为 WantedBy pdns-recursor 在它们的单元文件中,如下所示

[Unit]
WantedBy=pdns-recursor.service
Run Code Online (Sandbox Code Playgroud)

但是,我仍然在 nginx 和 ntp 中收到有关无法在启动时解析名称的日志消息。

如何在这些服务尝试启动之前验证 DNS 已完全启动?我正在使用 Ubuntu 16.04

Aug 09 22:35:25 host.blah ntpd[3574]: restrict: ignoring line 21, address/host 'ntp.blah' unusable.
Aug 09 22:35:26 host.blah ntpd[3574]: restrict: ignoring line 23, address/host 'ntp.blah' unusable.
Aug 09 22:35:28 host.blah ntpd[3574]: restrict: ignoring line 25, address/host 'ntp.blah' unusable.
Aug 09 22:35:29 host.blah ntpd[3574]: restrict: ignoring line 27, address/host 'ntp.blah' unusable.
Run Code Online (Sandbox Code Playgroud)

Bra*_*o__ 19

我在 ntp 和 nginx 单元文件中放置了一个ExecStartPre,以便在继续之前继续尝试解析名称。

这工作正常。正常的 systemd 结构(例如等待其他服务在线)是不可靠的,因为 pdns 守护进程已启动并不意味着它一定能够在启动后的前几毫秒内回答查询。

ExecStartPre=/bin/sh -c 'until host example.com; do sleep 1; done'
Run Code Online (Sandbox Code Playgroud)


小智 8

尝试使用:

[Unit]
After=network-online.target
Wants=network-online.target
Run Code Online (Sandbox Code Playgroud)

Unix 和 Linux以及FreeDesktop站点上有完整的文章

  • 这并不可靠,因为“这到底需要什么,留给网络管理服务的实现”。当然,在 Raspberry Pi OS (Buster) 中,解析器只需运行即可,而不是连接到可能尚未运行的 DNS 服务器。例如在断电恢复的情况下。这对于 OP 来说不是什么大问题,但如果您需要一个功能正常的 DNS,那么这就是一个真正的问题。 (2认同)

mia*_*nos 7

systemd 足够灵活,可以做到这一点:

[Unit]
Description=Wait for DNS to come up using 'host'
After=nss-lookup.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'until host yourhost.com; do sleep 1; done'

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

然后你可以在需要 dns 挂载的单元文件中依赖这个单元:

[Unit]
Description=mount nfs
After=dns-ready.service
Run Code Online (Sandbox Code Playgroud)