现象:进程活着,但日志不再输出
自动化脚本通过 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 的代码,先问它的出口在哪:响应到达、消息报错、连接关闭、超时未响应------四道门少一道,就是今天的静默挂死。