在 network-online.target 之后启动 systemd 服务但 DNS 仍然不可用

MLu*_*MLu 5 systemd raspberry-pi raspbian

我有一个程序,我想在启动systemd时启动它,但只能在 DNS 可用后启动。

服务文件取决于network-online.target

$ cat  /etc/systemd/system/te-m-pi.service
[Unit]
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/opt/te-m-pi
ExecStart=/opt/te-m-pi/te-m-pi.py

[Install]
WantedBy=default.target
Run Code Online (Sandbox Code Playgroud)

但是,当它启动时,它立即退出,因为它无法解析它需要的一些主机名:

te-m-pi.py[399]: socket.gaierror: [Errno -2] Name or service not known
systemd[1]: te-m-pi.service: main process exited, code=exited, status=1/FAILURE
systemd[1]: Unit te-m-pi.service entered failed state.
Run Code Online (Sandbox Code Playgroud)

如果我编辑 python 文件并time.sleep(10)在最开始插入一个简单的,它会等待 10 秒,然后愉快地运行。

显然,当它启动时,网络尚不可用,尽管依赖于network-online.target. 我如何确保它仅在网络真正启动并配置好时才启动?

我正在使用 systemd 215-17+deb8u7 在 Raspbian 8 Jessie 上运行它。

小智 0

刚刚在 Ubuntu 20 上遇到了同样的问题,导致非常混乱的问题(例如,NFS 自动挂载器随机无法工作):网络实际上已在线,但 DNS 支持尚不可用。要确保 DNS 支持,请添加systemd-resolved.serviceAfterWants条目。