Bottle框架Python服务开机启动失败问题求助
从你的日志和描述来看,问题的核心很明确:系统开机时,你的网卡还没获取到192.168.1.103这个IP地址,导致Bottle服务尝试绑定该地址时失败。手动启动服务正常是因为此时网络已经完全就绪,IP已经分配完成。
下面是几个针对性的解决方案,按推荐程度排序:
方案1:绑定到所有网络接口(最推荐)
把Python代码里的绑定地址从固定IP改成0.0.0.0,这样服务会监听系统上所有可用的网络接口,不管IP是静态还是动态分配的,开机时只要有网络接口启动就能成功绑定:
run(host='0.0.0.0', port=8080)
这个方案最灵活,完全避开了开机时IP未就绪的问题,而且不影响你通过192.168.1.103访问服务(只要该IP分配给了你的机器)。
方案2:让systemd等网络完全就绪后再启动服务
如果一定要绑定固定IP,可以修改你的advairMeter.service文件,让服务在网络完全在线(网卡已获取IP)之后再启动:
[Unit] Description=Advair meter After=network-online.target Wants=network-online.target [Service] ExecStart=/usr/bin/python3 server.py Restart=always WorkingDirectory=/home/saul/Projects/PythonProjects/medSched/ [Install] WantedBy=multi-user.target
After=network-online.target:确保服务在网络完全就绪后启动Wants=network-online.target:告诉systemd要等待网络在线目标完成
修改后需要重新加载systemd配置并重启服务:
sudo systemctl daemon-reload sudo systemctl restart advairMeter.service
注意:这个方案可能会稍微延长开机时间,因为systemd会等待网络完全就绪。
方案3:配置静态IP
如果你的机器使用DHCP自动获取IP,开机时IP可能还没分配完成就触发了服务启动。可以把192.168.1.103设置为静态IP,这样系统开机时会直接分配该IP,服务启动时就能成功绑定。
具体的静态IP配置方法取决于你的Xubuntu版本(通常可以通过网络管理器或者编辑/etc/netplan下的配置文件完成)。
验证修改效果
不管用哪个方案,修改后执行以下命令确保服务开机自启:
sudo systemctl enable advairMeter.service
然后重启系统,用systemctl status advairMeter.service检查服务状态,或者用ss -tulpn | grep 8080确认端口是否被监听。
内容的提问来源于stack exchange,提问作者saulspatz

