我有一个程序,我想在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
然而,当它启动时,它会立即退出,因为它无法解析它需要的一些主机名:
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.
如果我编辑 python 文件并time.sleep(10)
在开头插入一个简单的文件,它会等待 10 秒,然后愉快地按预期运行。
显然,当它启动时,网络不是然而可用,尽管依赖于network-online.target
.我如何确保它仅在网络真正启动并配置后才启动?
我在 Raspbian 8 Jessie 上使用 systemd 215-17+deb8u7 运行它。
答案1
刚刚在 Ubuntu 20 上遇到了同样的问题,导致非常混乱的问题(例如,NFS 自动挂载器随机无法工作):网络实际上已在线,但 DNS 支持尚不可用。要确保 DNS 支持,请添加systemd-resolved.service
到After
和Wants
条目。