开机启动依赖网络的Python程序失败,如何配置systemd服务的After与WantedBy?
解决systemd服务开机启动时网络不可达的问题
这个问题我碰到过好多次——你的服务在网络完全就绪之前就被systemd启动了,所以才会抛出OSError: [Errno 101] Network is unreachable的错误。手动启动没问题,是因为此时你的网络早就正常工作了。
调整后的服务配置
直接修改你的服务文件,更新[Unit]段的内容即可:
[Unit] After=network.target network-online.target Wants=network-online.target [Service] Type=idle WorkingDirectory=/home/pi/ ExecStart=/usr/bin/python3 /home/pi/main.py [Install] WantedBy=multi-user.target
关键配置解释
After=network.target network-online.target:network.target只是标记网络服务已经启动,但不保证网络实际连通(比如可能还没获取到IP地址);而network-online.target会等待网络真正可达(能连接外部网络)。把这两个都加到After里,确保你的服务在网络彻底就绪之后才启动。Wants=network-online.target:
这个选项会让systemd在启动你的服务时,主动触发network-online.target的启动流程(如果它还没就绪的话),避免出现“服务启动了,但网络目标没被激活”的情况。WantedBy=multi-user.target:
这个字段不用改,它表示你的服务会在多用户环境下启动,完全符合你的需求。
额外注意事项
- 修改完配置后,记得重新加载systemd并重启服务:
sudo systemctl daemon-reload sudo systemctl enable --now your-service-name.service - 如果你的Pi用的是Wi-Fi,偶尔可能会出现
network-online.target等待超时的情况,你可以调整超时时间(在/etc/systemd/system.conf里修改DefaultTimeoutStartSec),或者针对Wi-Fi接口更精准地指定依赖:After=sys-subsystem-net-devices-wlan0.device - 可以用
systemctl list-dependencies network-online.target查看这个目标依赖的服务,确认你的网络管理器(比如NetworkManager或systemd-networkd)已经正确配置,能正常触发network-online.target。
内容的提问来源于stack exchange,提问作者PacCol
相关产品推荐
相关产品推荐

