树莓派开机自启Python套接字遇[Errno 98]地址已占用问题求助
嘿,我来帮你拆解问题并给出解决方案!
核心问题分析
1. 端口被系统默认服务占用
你脚本里绑定的PORT = 22是树莓派默认的SSH服务端口——从你执行的netstat -lptn输出能明确看到tcp 0 0 0.0.0.0:22 0.0.0.0.* LISTEN -,说明这个端口已经被系统的SSH服务占用了,你的脚本根本没法绑定这个端口,这是[Errno 98] Address already in use的直接诱因。
2. 脚本被重复启动
你同时通过.bashrc和lxsession两种方式配置了开机启动,导致同一程序被启动了两次:一次是sudo权限的进程(PID 927),一次是非sudo权限的进程(结合你后续排查的PID不一致情况,完全能确认是双启动方式导致的重复进程)。两个进程都在争抢同一个已被占用的端口,自然会持续抛出错误,通信也无法建立。
分步解决方案
1. 更换脚本绑定的端口
立刻修改set_server函数里的PORT值,换成一个未被系统占用的自定义端口(比如8000、9001这类常用端口):
def set_server(): global conn_global global socket_global global conn_established HOST = '' PORT = 8000 # 替换成任意未被占用的端口 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) s.listen(1) conn, addr = s.accept() socket_global = s conn_global = conn conn_established = 1
2. 移除重复的开机启动配置
只保留一种开机启动脚本的方式,二选一操作:
- 打开
~/.bashrc文件,找到那行sudo python /home/pi/Documents/3_multithread.py,删除后保存退出; - 或者进入lxsession的启动项设置界面,移除对应的脚本启动命令。
如果你的脚本需要管理员权限才能正常运行(比如访问GPIO等硬件资源),请统一用sudo启动,避免权限不一致引发其他问题。
3. 验证修复效果
修改完成后重启树莓派,执行以下命令确认修复成功:
- 检查进程:
ps -fA | grep python,应该只看到一个3_multithread.py的进程在运行; - 检查端口绑定:
netstat -lptn | grep 8000(替换成你设置的新端口),能看到你的Python进程正在监听这个端口; - 尝试两台树莓派之间的通信,此时应该能正常建立连接并传输命令了。
小技巧:添加日志方便排查
可以在脚本开头加入简单的日志输出,记录启动信息,后续排查问题更方便:
import os print(f"脚本启动成功,PID: {os.getpid()},绑定端口: {PORT}")
内容的提问来源于stack exchange,提问作者Tobse




