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
相关产品推荐
相关产品推荐

