From 09103abf385ed8cbc9b7545ac7dc38d73970ea8f Mon Sep 17 00:00:00 2001 From: CakeCN Date: Thu, 8 Jan 2026 00:11:31 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=BA=86=E4=B8=8D=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E7=9A=84=E5=B1=9E=E6=80=A7=E5=BC=95=E7=94=A8=20?= =?UTF-8?q?=EF=BC=9A=E5=88=A0=E9=99=A4=E4=BA=86=E5=AF=BC=E8=87=B4=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E7=9A=84=20eventlet.greenthread.main=20=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code-server-like/app/__init__.py | 48 +++++++++++++++++--------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/code-server-like/app/__init__.py b/code-server-like/app/__init__.py index 90eb9d0..91d797d 100644 --- a/code-server-like/app/__init__.py +++ b/code-server-like/app/__init__.py @@ -38,28 +38,32 @@ try: error_counts[error_key] = 1 return False - # 4. 增强错误处理,确保所有绿色线程错误都被捕获 - # 保存原始的 greenlet 主函数,包装它以捕获所有异常 - import eventlet.greenthread - original_main = eventlet.greenthread.main - - def custom_greenthread_main(*args, **kwargs): - """包装 greenlet 主函数,捕获所有异常,防止服务器宕机""" - try: - return original_main(*args, **kwargs) - except Exception as e: - # 捕获所有绿色线程中的异常 - if not is_duplicate_error(e): - print(f"[Eventlet GreenThread Error] {type(e).__name__}: {e}") - print("[Traceback]") - traceback.print_exc() - # 返回 None 继续运行,防止服务器宕机 - return None - - # 替换原始的 greenlet 主函数 - eventlet.greenthread.main = custom_greenthread_main - - # 5. 只修改关键的 greenio 方法,确保在致命错误时彻底关闭连接 + # 4. 只修改关键的 greenio 方法,确保在致命错误时彻底关闭连接 + # 增强 socketio 错误处理,确保不会因为单个连接错误而宕机 + try: + from flask_socketio import SocketIO + # 获取当前 socketio 实例并配置错误处理 + import sys + original_excepthook = sys.excepthook + + def custom_excepthook(exc_type, exc_value, exc_traceback): + """全局异常钩子,捕获所有未处理的异常""" + if exc_type.__name__ in ['OSError', 'IOError'] and 'Bad file descriptor' in str(exc_value): + # 处理 Bad file descriptor 错误,不导致服务器宕机 + if not is_duplicate_error(exc_value): + print(f"[Global Error Handler] {exc_type.__name__}: {exc_value}") + print("[Traceback]") + traceback.print_exception(exc_type, exc_value, exc_traceback) + # 不调用原始的 excepthook,防止服务器宕机 + return + # 其他异常调用原始的 excepthook + original_excepthook(exc_type, exc_value, exc_traceback) + + # 设置全局异常钩子 + sys.excepthook = custom_excepthook + except Exception as e: + # 如果修改失败,忽略错误 + print(f"[Global Excepthook Patch Error] {e}") from eventlet import greenio # 保存并替换原始的 greenio 方法