![当(本地)DNS 解析准备就绪时,如何启动 systemd 服务?](https://linux22.com/image/13019/%E5%BD%93%EF%BC%88%E6%9C%AC%E5%9C%B0%EF%BC%89DNS%20%E8%A7%A3%E6%9E%90%E5%87%86%E5%A4%87%E5%B0%B1%E7%BB%AA%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E5%90%AF%E5%8A%A8%20systemd%20%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
如何将自定义 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
临时解决方法:
- 方法 1(不起作用)我认为我在使用
nss-lookup.target
.它被描述为“应该用作所有主机/网络名称服务查找的同步点的目标”。 (看https://www.freedesktop.org/software/systemd/man/systemd.special.html)。例如与指令一起使用:
Wants=network-online.target nss-lookup.target
After=network-online.target nss-lookup.target
虽然看起来很有希望,但方法 1 似乎不起作用。
- 方法2.我通过参考
pihole-FTL.service
.看来(我没有测试过)由于该Wants
指令,如果 pihole-FTL 不可用,它仍然可以工作。看https://unix.stackexchange.com/a/423724/40237
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
...