liuzhuohua
147a402eca
fix(webshell): 修复 PTY 故障与终端满员自锁,补容器形态守护拉起
Web 终端「任何账号都连不上」的两个真实故障,以及容器形态下终端完全打不开。
- shelld: 根因是 /dev/ptmx 符号链接丢失(/dev/pts/ptmx 还在),
pty.openpty() 找不到入口,内核却报 "out of pty devices" ——
把「少一个设备节点」说成了「设备耗尽」,排查方向被带偏。
新增 ensure_ptmx():启动时与创建失败时都探测,先补 symlink,
不行再 mknod 兜底;仍失败则回 PTY_FAIL 并给出可照抄的命令
- shelld: 会话锁由 threading.Lock 改为 RLock。原锁不可重入,而
connect 在持锁状态下调用 _reap_idle() 会二次取同一把锁 ——
同线程二次 acquire 不报错不超时、直接睡死,锁永不释放,
第 9 个连接起整个终端服务冻死且日志无痕。
connect 不再持锁调回收;_reap_idle() 的 close() 移到锁外
- helper: 容器里没有 systemd,拉起终端守护原来只有 systemctl 一条路径,
导致容器形态 Web 终端永远「终端守护未运行」。新增 _shelld_spawn() 回退:
直接以子进程启动守护(start_new_session 脱离父进程);
错误文案改为「容器形态无 systemd,重启容器即可」
- 前端: 终端去掉滚动条(仅隐藏外观,滚动能力保留)、
高度改为随视口 clamp 自适应;新增「清屏」与「↓ 最新」按钮
- 打包: build-deb.sh 与 Dockerfile 不再整体拷 docs/ ——
install/COPY 撞上 docs/screenshots/ 目录会报错(install 遇目录返回非 0,
在 set -e 下直接中断整个打包);截图本就不该进 deb/镜像
- 修正两处不一致: index.html 页脚误写「GPL v3」→ MIT(与 LICENSE 对齐);
README 中 deb 体积 421 KB → 427 KB(实测 437584 字节)
- 版本号 1.0.0 → 1.0.1(源码、打包脚本、文档、镜像标签、编排文件)
测试: _dev/t-pty.py 扩到 45 项,含「_lock 必须是 RLock」的行首断言
(原先用子串匹配被 self.buf_lock 误伤);t-webshell.py 补 16 项外观契约。
真机 192.168.7.3 实测:第 9 个连接 0.01s 干净返回 BUSY,
断开 8 会话 0.87s 全清、残留 0,PTY/fd 回落基线;
自愈验证(删掉 /dev/ptmx 重启服务可自动补回)。
容器冒烟 12/0:无 systemd 环境下守护成功拉起、
root shell 建会话并跑通命令回显。41 个单测文件全绿。
2026-10-01 03:09:19 +08:00
..
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-10-01 03:09:19 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00
2026-09-30 19:26:24 +08:00