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

Websocket服务断开时until脚本无法自动重启,请求解决自动重启问题

解决WebSocket断开时脚本无法自动重启的问题

你的until循环仅在myscript进程主动退出时才会触发重启逻辑,但如果WebSocket连接断开后,myscript进程没有终止(比如卡在阻塞状态、未捕获连接异常),循环就不会执行重启操作。以下是两种可行的解决方案:

方案1:修改Python脚本,让它在连接断开时主动退出

在myscript.py中捕获WebSocket连接断开的异常,捕获后主动退出进程,让外层until循环检测到并重启。示例代码片段:

import sys
import websocket

def main():
    try:
        ws = websocket.create_connection("ws://你的WebSocket服务器地址")
        while True:
            data = ws.recv()
            # 这里写你的业务处理逻辑
    except websocket.WebSocketConnectionClosedException:
        print("WebSocket连接已断开,退出进程")
        sys.exit(1)
    except Exception as e:
        print(f"发生错误: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()

这样当WebSocket连接断开时,脚本会以非0状态码退出,外层until循环会立刻执行重启操作。

方案2:修改监控脚本,主动检测连接状态

如果不想修改Python代码,可以在Shell脚本中主动检测WebSocket连接是否正常,一旦断开就终止脚本进程并重启。示例脚本:

#!/bin/bash

# 替换为你的Python脚本路径和WebSocket地址
SCRIPT="/path/to/myscript.py"
WS_SERVER="你的WebSocket服务器地址(如ws://localhost:8080)"

# 解析WebSocket服务器的主机和端口
WS_HOST=$(echo $WS_SERVER | awk -F'://' '{print $2}' | awk -F':' '{print $1}')
WS_PORT=$(echo $WS_SERVER | awk -F':' '{print $3}')

check_ws() {
    # 发送WebSocket握手请求测试连接
    echo -e "GET / HTTP/1.1\r\nHost: $WS_HOST\r\nConnection: Upgrade\r\nUpgrade: websocket\r\nSec-WebSocket-Key: test-key\r\nSec-WebSocket-Version: 13\r\n\r\n" | nc $WS_HOST $WS_PORT > /dev/null 2>&1
    return $?
}

while true; do
    # 启动Python脚本
    python3 $SCRIPT &
    PID=$!

    # 监控进程和连接
    while kill -0 $PID 2>/dev/null; do
        if ! check_ws; then
            echo "WebSocket连接断开,终止脚本进程"
            kill $PID
            break
        fi
        sleep 3  # 每3秒检查一次连接状态
    done

    echo "脚本已退出,2秒后重启..."
    sleep 2
done

这个脚本会定期检测WebSocket连接,一旦发现断开就杀掉当前的myscript进程,触发后续的重启逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:35:28