From 761095d61dcab6d292c815242f35c0a3a96403bc Mon Sep 17 00:00:00 2001 From: CakeCN Date: Tue, 6 Jan 2026 21:05:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86code-server-like?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=B8=AD=E7=9A=84eventlet.hubs.IOClosed?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=9A=E5=BD=93=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E6=96=AD=E5=BC=80=E8=BF=9E=E6=8E=A5=E6=97=B6=EF=BC=8C=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=8F=8F=E8=BF=B0=E7=AC=A6=E8=A2=AB=E5=85=B3=E9=97=AD?= =?UTF-8?q?=EF=BC=8C=E4=BD=86=E5=90=8E=E5=8F=B0=E4=BB=BB=E5=8A=A1=E4=BB=8D?= =?UTF-8?q?=E5=9C=A8=E5=B0=9D=E8=AF=95=E8=AF=BB=E5=8F=96=EF=BC=8C=E5=AF=BC?= =?UTF-8?q?=E8=87=B4eventlet=E6=A0=B8=E5=BF=83=E4=BB=A3=E7=A0=81=E6=8A=9B?= =?UTF-8?q?=E5=87=BAIOClosed=E9=94=99=E8=AF=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/sockets/terminal_service.py | 44 ++++++++++++------- code-server-like/run.py | 8 ++++ 2 files changed, 37 insertions(+), 15 deletions(-) diff --git a/code-server-like/app/sockets/terminal_service.py b/code-server-like/app/sockets/terminal_service.py index 2a6d141..3d33442 100644 --- a/code-server-like/app/sockets/terminal_service.py +++ b/code-server-like/app/sockets/terminal_service.py @@ -67,21 +67,35 @@ def read_and_forward_pty_output(fd=None, pid=None, room_id=None,namespace=None): return if fd: timeout_sec = 0 - (data_ready, _, _) = select.select([fd], [], [], timeout_sec) - if data_ready: - # output = os.read(fd, max_read_bytes).decode('ascii') - timeout=0.1 - try: - output = os.read(fd, max_read_bytes).decode() - except Exception as err: - output = """ - ***AQUI WEB TERM ERR*** - {} - *********************** - """.format(err) - # the key for different visitor to get different terminal (instead of mixing up) - # is to let the background task push pty response to each one's own (default) ROOM! - namespace.emit("pty_output", {"output": output}, room=room_id) + try: + # Check if file descriptor is still valid by trying to select on it + (data_ready, _, _) = select.select([fd], [], [], timeout_sec) + if data_ready: + timeout=0.1 + try: + output = os.read(fd, max_read_bytes).decode() + except (OSError, IOError, EOFError) as err: + # File descriptor closed or other IO error, exit gracefully + return + except UnicodeDecodeError as err: + output = """ + ***AQUI WEB TERM ERR*** + Unicode decode error: {} + *********************** + """.format(err) + # the key for different visitor to get different terminal (instead of mixing up) + # is to let the background task push pty response to each one's own (default) ROOM! + try: + namespace.emit("pty_output", {"output": output}, room=room_id) + except Exception: + # If emit fails, the client is probably disconnected, exit + return + except (OSError, IOError) as err: + # File descriptor closed or invalid, exit gracefully + return + except Exception as e: + # Catch any other unexpected exceptions to prevent server crash + pass finally: # Clean up file descriptor if it's open if fd: diff --git a/code-server-like/run.py b/code-server-like/run.py index 9b112c1..48cdcd7 100644 --- a/code-server-like/run.py +++ b/code-server-like/run.py @@ -1,5 +1,12 @@ from app import create_app from app.extensions import socketio +import logging + +# 配置日志,减少eventlet的调试日志 +logging.getLogger('eventlet').setLevel(logging.ERROR) +logging.getLogger('socketio').setLevel(logging.ERROR) +logging.getLogger('werkzeug').setLevel(logging.ERROR) + app = create_app() if __name__ == '__main__': @@ -9,4 +16,5 @@ if __name__ == '__main__': port=5200, debug=False, # 开发期打开 allow_unsafe_werkzeug=True, # 避免 dev server 的安全限制提示 + log_output=False # 禁用详细输出 )