You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开机启动依赖网络的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:
    这个字段不用改,它表示你的服务会在多用户环境下启动,完全符合你的需求。

额外注意事项

  1. 修改完配置后,记得重新加载systemd并重启服务:
    sudo systemctl daemon-reload
    sudo systemctl enable --now your-service-name.service
    
  2. 如果你的Pi用的是Wi-Fi,偶尔可能会出现network-online.target等待超时的情况,你可以调整超时时间(在/etc/systemd/system.conf里修改DefaultTimeoutStartSec),或者针对Wi-Fi接口更精准地指定依赖:
    After=sys-subsystem-net-devices-wlan0.device
    
  3. 可以用systemctl list-dependencies network-online.target查看这个目标依赖的服务,确认你的网络管理器(比如NetworkManager或systemd-networkd)已经正确配置,能正常触发network-online.target。

内容的提问来源于stack exchange,提问作者PacCol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:32:46