如何判断哪个 Claude Code、Codex 或 OpenCode 会话卡住了(不用挨个查看 10 个终端)
一套实用工作流,区分“等待审批”、“离线”和“其实还在运行”。先做轻量检查,有条件时再用适合手机的控制循环。
- CLI
- 0.2.17
- 预览 ref
- a2c45c8
一个常见的尴尬场景:
好几个会话在跑(Claude Code、Codex、OpenCode)。你放下笔记本离开了一会儿。回来后感觉哪里不对。
不是“崩溃了”,而更像是:
- 什么都没在动
- 输出停在了半句话
- 会话显示“运行中”,但不清楚它到底有没有在做事
麻烦的是开销:如果你有 5 到 10 个会话,光是搞清楚哪个需要处理就可能花掉 20 分钟。
这篇指南提供一套工作流,用来快速回答一个问题:
到底是哪个会话卡住了,卡在哪种状态?
要点
- 不要猜。先给“卡住”分类:
- 等待审批 / 需要输入(常见情况)
- 断开连接 / 离线(机器休眠、Wi-Fi 断开)
- 忙碌(仍在运行,只是慢)
- 出故障(崩溃 / 卡死)
- 从门槛低的检查开始(会话列表、最后活动时间、看一眼日志末尾)。
- 如果你想要一个适合手机的“现在有什么需要处理?”循环,Happier 是可以帮上忙的选项之一:它有全局收件箱(Inbox),并能为请求做通知路由。
问题(用大白话说)
大多数“卡住的会话”其实并没有卡住。
它们在等待。
- 在等一个权限提示
- 在等一个你没回答的问题
- 因为笔记本休眠、客户端断开而在等
难就难在,终端不会告诉你“这个需要你处理”,只会告诉你“这个进程还在”。
而当你有多个会话时,代价不在修复,而在诊断。
常见做法及其取舍
- 少开几个会话:有时可行,但真正的工作往往会并行化。
- 每个仓库一个 tmux 窗口并统一命名:有帮助,但仍然要手动逐个查看。
- 查看日志末尾(Codex 的 log_dir / OpenCode 日志):有用,但你还是得打开正确的那个。
- Claude Code 内置的恢复 / 命名功能和 Agent Teams 视图:有用,但不能提供跨提供商的“待处理清单”。
如果你想在手机(或浏览器)上拥有这样的“待处理清单”,Happier 是一款开源应用,让你跨设备运行和编排 Claude Code、Codex、OpenCode 及其他代理。它把审批和请求集中在一个地方显示。
如果你第一次接触 Happier(它是什么、在哪里获取)
Happier 是一款面向 Claude Code、Codex 和 OpenCode 等编程会话的开源配套应用(移动端 / 网页 / 桌面端)。
工作流是:会话持续在你信任的机器(笔记本 / 服务器 / 开发机)上运行,你在手机上用 Happier 监控、审批并推进工作。
开始设置:
- 如何在手机上使用 Happier
- GitHub: https://github.com/happier-dev/happier
- 安装 / 下载: https://github.com/happier-dev/happier#how-it-works
- Discord: https://discord.gg/W6Pb8KuHfg
一份可行的诊断清单
1) 首先:它是在等你吗?
如果会话“卡住了”,先问:它是不是其实在等人做决定?
常见迹象:
- 最后的输出是一个问题(“我该选哪个方案?”)
- 会话在等工具权限
- 会话处于需要用户操作的提供商特定模式(例如退出计划模式)
如果你用的是 Happier,全局收件箱在这里就派上用场了:审批请求和权限 / 用户操作请求都会出现在那里,通知路由会尽量把你带到真正需要处理的那个会话。
2) 其次:是不是机器休眠或 Wi-Fi 断开导致客户端断连?
如果你合上了笔记本、切换了网络,或者客户端进入了后台,进程可能没事,但你看到的画面已经过期。
常见的解决办法取决于你的工具:
- 如果你用的是 SSH,Mosh 是针对这类“移动 + 休眠”问题省事的升级。
- 如果工具是客户端 / 服务器式的流式界面,你可能需要重新连接或重新加载数据流。
(确实有客户端 / 服务器式工具出现“休眠后会话状态过期”问题的实际报告。这种情况下,解决办法通常是“重连并升级”。)
3) 再次:它是不是在忙,只是慢?
会话在以下情况下可能看起来像卡住了:
- 正在处理一个很大的 diff
- 正在跑测试
- 正在等一个很慢的网络请求
这时你需要的是进度信号:
- 最后一次工具调用的时间
- 最后一次文件编辑
- 最后一次 token 输出
如果拿不到任何进度信号,就把它当作出故障,进入下一步。
4) 最后:把它当作卡死处理(并选择安全的干预方式)
如果你确信它真的卡死了:
- 优先选择低风险的中断(“停下来,总结一下你进行到哪了”)
- 然后重启或恢复
如果你在意保留会话身份,就不要盲目杀进程。如果有可恢复的机制,就用 resume / attach 路径,而不是“新开一个再粘贴上下文”。
手机优先的“待处理清单”工作流(Happier)
如果你运行着很多会话,又不断在诊断上浪费时间,Happier 带给你的主要价值不是“更强的功能”。
而是更少的寻找:
-
收件箱回答:“现在有什么需要我处理?”
-
通知直接跳转到正确的会话(以及正确的服务器配置)
-
需要处理(Needs attention)把卡在等你的会话归到一起,其余会话就能继续运行,你不必逐个检查
用提醒把会话暂时放到一边
有些会话并没有卡住,只是接下来两个小时不需要你操心。从 0.2.13 开始,你可以有意把它们放到一边:
- 打开会话行的菜单,选择提醒我(Remind me)。
- 选择一个建议时间、选择日期和时间…(Choose date and time…)或已保存的预设。
设置提醒会把会话标为已读,并在到时间前把它移出需要处理。到时间后它会回到那里,即使期间没有任何新动静。从 0.2.16 开始,打开会话会清除已到期的提醒(如果你更想手动清除,可以关闭设置 → 会话 → 打开时清除提醒(Settings → Session → Clear reminders on open))。提醒改变的是 Happier 应用内的待处理状态,不会发送推送。详情见会话已读状态文档。
不停下忙碌的会话也能纠偏
如果会话正在忙但方向不对,在代理支持引导的情况下,立即插入(Steer now,0.2.16)会在不中断当前回合的情况下把你排队的消息交给代理。立即发送(Send now)仍然会中断。参见引导。
在电脑前时让手机保持安静
同样是 0.2.16 的新功能:一个可选的通知设置,会在 Happier 于电脑上处于焦点时静音手机推送。如果无法确认电脑焦点,推送仍会发到手机上。
坦诚的取舍:这取决于机器仍然可以访问。
故障排查
我分不清它是卡住了还是在等待
逼它给出答案:
- 发一条简短消息:“你是在等我的输入,还是还在运行?”
- 如果工具支持,请求一行状态更新
我总是跟丢会话
用下面这些模式之一:
- 每个任务一个工作树 / 一个会话
- 会话和仓库命名一致
- 一个统一的“待处理清单”(收件箱、需要处理、通知)
- 对已读但想稍后再看的会话设置提醒我时间