自动化脚本“卡住无输出“怎么办: 一次 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 的代码,先问它的出口在哪:响应到达、消息报错、连接关闭、超时未响应------四道门少一道,就是今天的静默挂死。

相关推荐
海宇服务16 小时前
零信任架构实战:基于海宇身份证OCR构建自动化自助终端核验网关
运维·人工智能·架构·自动化
ken223216 小时前
ubuntu 24.04, audacity 4 AppImage 加载 libavdevice.so.62 /.61 /.63 失败:依赖缺失?
linux·运维·ubuntu
web打印社区16 小时前
JS 静默打印怎么做:纯前端为什么不行,以及最小可跑通写法
开发语言·前端·javascript·websocket·网络协议·http·pdf
web打印社区16 小时前
HTML5 静默打印:前端页面怎么调用打印机且尽量不弹窗
前端·javascript·vue.js·pdf·html·html5
未完成的歌~16 小时前
Windows 系统镜像备份还原 操作手册
运维
阳光九叶草LXGZXJ16 小时前
达梦数据库-学习-69-DM9主备集群部署
linux·运维·服务器·数据库·sql·学习
Sun 328517 小时前
Linux 常用命令梳理
linux·运维·服务器·开发·常用命令
ai小陈17 小时前
深度学习CUDA异步报错定位:从错误堆栈到最小复现
运维·人工智能·深度学习·ai·gpu算力
Chill6017 小时前
服务器home文件夹太小怎么把配置迁移到其他盘
运维·服务器
星恒随风17 小时前
Linux开发工具详解(一):软件包管理、Vim、GCC/G++、Makefile与进度条实战
linux·运维·笔记·学习·vim