当(本地)DNS 解析准备就绪时,如何启动 systemd 服务?

当(本地)DNS 解析准备就绪时,如何启动 systemd 服务?

如何将自定义 systemd 服务配置为仅在 DNS 解析准备好处理后启动?

该服务是一个一次性脚本,在启动后立即向我发送设备当前的 WAN 和 LAN IP 地址。以前可以用,但是安装Pi-hole后,开机自动运行就停止了。手动触发服务sudo systemctl start mail-ip-at-boot.service仍然有效。

启动时,它会失败,因为名称解析(例如邮件服务器的主机名)存在问题。从/var/log/syslog

sendemail[1182]: ERROR => Connection attempt to smtp.<myisp>:25 failed IO:Socket::INET6 getaddrinfo: Temporary failure in name resolution.

我有一个类似的问题报告dig(我在我的 mailip 脚本中使用):dig: couldn't get address for 'resolver1.opendns.com': failure。我已经通过将resolver1主机名替换为其固定IP地址解决了这个问题。当然,这只是一种解决方法。

无论是否安装了 Pi-hole,该解决方案都应该有效。

以下是我当前的服务定义。

me@raspberripi:~$ cat /etc/systemd/system/mail-ip-at-boot.service
[Unit]
Description=Mail WAN and LAN IP address
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/mailip.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

临时解决方法:

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

虽然看起来很有希望,但方法 1 似乎不起作用。

    Wants=network-online.target pihole-FTL.service
    After=network-online.target pihole-FTL.service

我完全不喜欢方法 2,因为我创建了与 pihole 的耦合。不好的做法

答案1

创建一个新的一次性服务,该服务会阻塞直到主机名查找正常工作。例如,类似:

[Unit]
Description=Wait for DNS
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'while ! host smtp.example.com; do sleep 1; done'

然后让你的“邮件WAN和LAN IP地址”服务依赖于此:

[Unit]
Description=Mail WAN and LAN IP address
Wants=network-online.target wait-for-dns.service
After=network-online.target wait-for-dns.service

...

相关内容