You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

树莓派开机自启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. 脚本被重复启动

你同时通过.bashrclxsession两种方式配置了开机启动,导致同一程序被启动了两次:一次是sudo权限的进程(PID 927),一次是非sudo权限的进程(结合你后续排查的PID不一致情况,完全能确认是双启动方式导致的重复进程)。两个进程都在争抢同一个已被占用的端口,自然会持续抛出错误,通信也无法建立。


分步解决方案

1. 更换脚本绑定的端口

立刻修改set_server函数里的PORT值,换成一个未被系统占用的自定义端口(比如80009001这类常用端口):

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

火山引擎 最新活动