自动化脚本“卡住无输出“怎么办: 一次 WebSocket 挂死的排查与自愈模板

现象:进程活着,但日志不再输出

自动化脚本通过 DevTools 协议驱动浏览器干活,跑到一半日志停住,终端安静,进程既不报错也不退出。只看退出码和日志会以为"还在跑",实际上协议通道早就断了,等响应的请求在无限期等待。

根因:pending Promise 没有超时

典型的 CDP 封装是发请求时把 Promise 存进 pending map,收到同 id 的消息再 resolve。一旦对端先死------浏览器标签被关、进程被杀、网络断开------ws 只会触发 close 事件,所有 pending 的 Promise 永远悬空:事件循环里没有待办事项,也没有"任务完成"信号,解释器就这么干等。静默挂死最难缠的地方是它看起来像"任务慢",于是你一直等,浪费大量时间。

三层自愈模板

一、显式 close 处理:给连接注册 onclose 回调,直接打印诊断日志并 process.exit 非零码,不等自然退出;二、请求级超时:send 包一层 Promise.race 超时(比如 30 秒),超时 reject 并带上 method 名,把"永远没响应"变成可见错误;三、磁盘验收:以日志文件和磁盘产物为准判断进度,而不是进程存活------日志 N 分钟没推进就判挂死,拉最后几行日志定位或直接重启。

举一反三

任何"按 id 等远端响应"的模式(JSON-RPC、消息队列回调、子进程 stdio)都踩同一个坑。写往 map 里塞 Promise 的代码,先问它的出口在哪:响应到达、消息报错、连接关闭、超时未响应------四道门少一道,就是今天的静默挂死。

相关推荐
只睡四小时12 小时前
端侧推理:face-api.js 首屏 92% 是白下载的
开发语言·javascript·人脸识别·ecmascript·tensorflow.js·face-api.js·端侧推理
中屹指纹浏览器svip12 小时前
中屹指纹浏览器和普通 Chrome 有什么区别?
前端·chrome·中屹指纹浏览器
Initialize2930812 小时前
Docker 容器网络不通?五步排查法
运维
用户831348593069812 小时前
Vue3 v-for:常用用法与开发高频坑点
前端·javascript·vue.js
Funlang12 小时前
fun-ui 开源:把浏览器界面接回来
前端·javascript
2603_9658966212 小时前
CSS BEM 命名规范|组件化样式分层权威指南
前端·javascript·css
Web极客码12 小时前
决策模型 + LLM:用 Python 拆解浏览器自动化工作流
java·python·自动化
重生之高冷汉堡包13 小时前
家庭住宅IP是什么?机房住宅与普通住宅有什么区别
运维·服务器·网络·网络协议·tcp/ip·用户运营
Thneonl13 小时前
git reset --hard 之后先别哭:reflog 里存着你刚弄丢的那个分支
运维·后端
见闻小天地13 小时前
液冷直流负载:AI 算力中心带载测试的关键设备
运维·业界资讯