Skip to content

fix(captcha): 补齐 puppeteer-core lock 并修复 Chromium 进程泄漏(关联 #1) - #12

Open
zephyr-xiao wants to merge 1 commit into
dengyie:mainfrom
zephyr-xiao:fix/captcha-chromium-windows
Open

zephyr-xiao wants to merge 1 commit into
dengyie:mainfrom
zephyr-xiao:fix/captcha-chromium-windows

Conversation

@zephyr-xiao

Copy link
Copy Markdown

问题

  1. npm ci 失败,真浏览器求解器起不来:2.6.3 给 captcha_node/package.json 加了 puppeteer-core 依赖,但 package-lock.json 没有同步更新。任何按 lock 安装的部署(Docker、CI、npm ci)都会直接报错,验证码求解必然失败,表现为 验证码求解失败: 多次重试无结果 (HTTP 500) (4028)(issue 无法完成人机校验: 验证码求解失败: 多次重试无结果 (HTTP Status: 500) (4028) #1)。
  2. Chromium 进程泄漏:Chromium 启动后会 setsid 脱离 node 的进程组(PGID=SESS=自身)。node 正常退出时还能由 exit 钩子清理,但求解超时被 SIGKILL 或同步卡死时,killpg(node 组) 打不到它,每个残留实例约 360MB,长时间运行会把小内存机器拖死。

修法

  • captcha_node/package-lock.json:补齐 puppeteer-core 及其依赖树。
  • captcha_node/solver_pw.js:
    • 启动 Chromium 后记录 PID;
    • process.on("exit") 同步补杀(覆盖正常退出、exit(code)、未捕获异常);
    • 增加硬超时(默认 210s,早于调用方超时 20s),到点主动清场后 exit(2),避免挂死迫使调用方 SIGKILL 留下逃逸进程。
  • app/captcha.py:按 PPID==1 + cmdline 含 chromium 特征清扫孤儿进程兜底(并发求解中活跃 Chromium 的父进程是活着的 node,PPID≠1,不会误杀;非 Linux 无 /proc 时直接跳过)。

验证

  • 上游 main 基线测试 312 项全部通过;本分支合入后同样 312 项全绿。
  • 实际部署(Docker + NAS)观察:修复前求解超时后 ps 可见多个 PPID=1 的 Chromium 常驻;修复后连续多轮求解不再堆积。

附注

Windows 用户遇到 4028 还需把 ZCODE_CHROMIUM_PATH 指到本机 Chromium 可执行文件(该配置项上游已支持,默认值 /usr/local/bin/chromium 只适用于容器)。issue #1 评论里提到的「改一下 Chromium 路径」即此。

- captcha_node/package-lock.json 补 puppeteer-core:2.6.3 加依赖时未更新 lock,
  npm ci 直接失败,真浏览器求解器起不来
- solver_pw.js:记录 Chromium PID,exit 钩子 + 硬超时(早于调用方 20s)自我清场,
  防止被 SIGKILL 时留下已 setsid 逃逸、killpg 打不到的 Chromium
- captcha.py:按 PPID==1 + cmdline 特征清扫孤儿 Chromium 兜底(单实例约 360MB)

关联 issue dengyie#1:验证码 500/4028 的部分成因即求解器无法启动与进程堆积;
Windows 用户另需把 ZCODE_CHROMIUM_PATH 指到本机 Chromium(上游已有该配置项)。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant