From 8aa567cdf22c29c555eb2bb089a33fec2313ea0a Mon Sep 17 00:00:00 2001 From: CakeCN Date: Wed, 7 Jan 2026 01:06:13 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A8=E5=B1=80=E5=BC=82=E5=B8=B8=E6=8D=95?= =?UTF-8?q?=E8=8E=B7=EF=BC=8C=E7=89=B9=E5=88=AB=E6=98=AFIOClosed=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=8C=E9=81=BF=E5=85=8D=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E5=B4=A9=E6=BA=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code-server-like/app/__init__.py | 29 ++++++++++++++++++++++++++++- code-server-like/run.py | 26 +++++++++++++++++++------- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/code-server-like/app/__init__.py b/code-server-like/app/__init__.py index 06c3bb1..19879f5 100644 --- a/code-server-like/app/__init__.py +++ b/code-server-like/app/__init__.py @@ -1,5 +1,32 @@ import eventlet -eventlet.monkey_patch() # 进行猴子补丁操作 +import logging + +# 配置 eventlet 日志,抑制 IOClosed 等错误日志 +logging.getLogger('eventlet.hubs').setLevel(logging.CRITICAL) +logging.getLogger('eventlet.greenio').setLevel(logging.CRITICAL) + +# 进行猴子补丁操作 +eventlet.monkey_patch() + +# 配置 eventlet hub 以更优雅地处理 IOClosed 错误 +try: + from eventlet.hubs import hub + # 保存原始的 handle_error 方法 + original_handle_error = hub.Hub.handle_error + + def custom_handle_error(self, context, type, value, tb): + # 忽略 IOClosed 错误 + if type.__name__ == 'IOClosed' and 'Operation on closed file' in str(value): + return + # 其他错误调用原始方法 + original_handle_error(self, context, type, value, tb) + + # 替换原始方法 + hub.Hub.handle_error = custom_handle_error +except Exception as e: + # 如果修改失败,忽略错误 + pass + from flask import Flask from .views.routes import main_bp from .views.file import file_bp diff --git a/code-server-like/run.py b/code-server-like/run.py index 48cdcd7..c7e4dda 100644 --- a/code-server-like/run.py +++ b/code-server-like/run.py @@ -10,11 +10,23 @@ logging.getLogger('werkzeug').setLevel(logging.ERROR) app = create_app() if __name__ == '__main__': - socketio.run( - app, - host="0.0.0.0", - port=5200, - debug=False, # 开发期打开 - allow_unsafe_werkzeug=True, # 避免 dev server 的安全限制提示 - log_output=False # 禁用详细输出 + try: + socketio.run( + app, + host="0.0.0.0", + port=5200, + debug=False, # 开发期打开 + allow_unsafe_werkzeug=True, # 避免 dev server 的安全限制提示 + log_output=False # 禁用详细输出 ) + except KeyboardInterrupt: + print("Server stopped by user") + except Exception as e: + # 捕获所有异常,包括 eventlet 内部的 IOClosed 错误 + if "IOClosed" in str(type(e).__name__) or "Operation on closed file" in str(e): + # 优雅处理 eventlet 关闭文件的错误 + print("Eventlet IOClosed error handled gracefully") + else: + # 其他异常仍然打印 + import traceback + traceback.print_exc()