首页/文章/同时开好几个 Claude Code,哪个在干活、哪个卡住了?在新加坡 Mac mini 上做一块会话状态板

同时开好几个 Claude Code,哪个在干活、哪个卡住了?在新加坡 Mac mini 上做一块会话状态板

· Zumac.Ai

会话一多,人就变成了「切窗口的人」

一个 Claude Code 在改前端,一个在跑测试,一个在整理文档,还有一个在等你批准一条命令。并行本来是为了省时间,结果很多人发现:大部分精力花在了来回切窗口看谁在干活、谁卡住了上。

常见的几种情况:

  1. 等确认却没人看:某个会话弹出权限确认,停在那里半小时,你以为它还在跑。
  2. 早就跑完了:任务结束后会话安静地等下一句指令,你却还在等它「出结果」。
  3. 真卡住了:命令挂死或在等网络,窗口看起来和「正在思考」差不多。
  4. 记不清哪个窗口是哪个项目:tmux 里一排 0、1、2,每次都要进去看一眼。

解决思路很简单:让每个会话自己报告状态,你只看一张汇总表。下面的做法全部在一台常开的 Mac mini 上完成,不依赖额外服务。

Claude 账号由你自己开通并登录,请遵守 Anthropic 的服务条款与支持地区规则。本文只谈如何搭一个稳定合规的使用环境,不涉及共享或转卖账号。Zumac.Ai 与 Anthropic 没有官方合作关系。hooks 的事件名和输入字段以 Claude Code 官方 hooks 文档与你本机版本为准,升级后请重新验证一遍。

准备清单

  • 一台常开的 Mac mini(整机独享),已装 Claude Code,并用你自己的账号登录
  • tmux(brew install tmux)和 jq(brew install jq),后者用来解析 hook 收到的 JSON
  • 日常用 SSH 进机器,需要图形界面时用 UU 远程连接
  • 多个会话改同一个仓库时,先按 git worktree 并行 把目录隔开

步骤一:一个任务一个 tmux 会话,名字就是项目

先把「窗口编号」换成「人能看懂的名字」:

  1. 每个任务单独开一个会话:tmux new -s web-fix、tmux new -s api-test、tmux new -s docs。
  2. 在会话里进入对应目录再启动 Claude Code,让「会话名 = 项目或任务」。
  3. 看全部会话用 tmux ls,切换用 tmux switch -t api-test,或者在 tmux 里按前缀键加 s 打开会话列表。

光这一步,就能告别「2 号窗口是哪个来着」。但 tmux ls 只告诉你会话在不在,不告诉你 Claude Code 在干什么,所以还需要下一步。

步骤二:用 hooks 让每个会话自己写状态

Claude Code 的 hooks 会在特定时刻运行你指定的命令,并通过标准输入传入一段 JSON,其中包含 session_id、cwd 等字段。我们只用四个事件:

  • UserPromptSubmit:你发出指令,记为「工作中」
  • Notification:Claude Code 需要你确认权限或在等输入,记为「等你」
  • Stop:这一轮回答结束,记为「已停下」
  • SessionEnd:会话退出,删除这条记录

做法如下:

  1. 新建脚本 ~/.claude/hooks/status.sh,第一行写 #!/bin/bash,再用 chmod +x 加执行权限。
  2. 脚本逻辑只有几行:第一个参数是状态(working、waiting、idle、end);用 input=$(cat) 读入 JSON,再用 jq -r '.session_id' 和 jq -r '.cwd' 取出会话 ID 和目录。
  3. 用 tmux display-message -p '#S' 取当前 tmux 会话名(不在 tmux 里就记成 -)。
  4. 把「时间、状态、tmux 会话名、目录」用制表符连成一行,覆盖写入 ~/.claude-status/<session_id>;状态是 end 时直接删掉这个文件。
  5. 脚本最后 exit 0。状态记录只是辅助信息,写失败也不能挡住 Claude Code 正常工作,所以不要在这里返回会拦截操作的退出码。
  6. 在 ~/.claude/settings.json 的 hooks 里,为上面四个事件各挂一条 type 为 command 的命令,例如 UserPromptSubmit 对应 ~/.claude/hooks/status.sh working,Notification 对应 ~/.claude/hooks/status.sh waiting,以此类推。

写在用户级 settings.json 里,这台 Mac mini 上所有项目的会话都会自动上报,不用每个仓库各配一遍。改完后开一个新会话,发一句话,再看 ~/.claude-status/ 下有没有出现文件,确认生效。

步骤三:一条命令看完所有会话

再写一个汇总脚本,比如 ~/bin/ccs:

  1. 把 ~/.claude-status/ 下所有文件的内容合起来,按状态排序,用 column -t 对齐输出。这样「等你」的会话排在一起,最先处理。
  2. 加一条「可能卡住」判断:状态是「工作中」、但文件超过 20 分钟没更新的,用 find ~/.claude-status -mmin +20 找出来,单独标注。阈值按你的任务长短调整,跑大型测试的项目可以放宽。
  3. 顺手清理残留:会话异常退出时 SessionEnd 可能来不及触发,超过一天没更新的文件可以直接删掉。

现在只要 SSH 上去敲一次 ccs,就能看到类似「web-fix 等你、api-test 工作中、docs 已停下」的一张表,而不是挨个 attach 进去看。

步骤四:把「等你」的数量放进 tmux 状态栏

如果你习惯一直挂在 tmux 里,可以让状态栏常驻显示待处理数量:

  1. 写一个小脚本 ~/bin/ccs-count,统计状态为「等你」和「可能卡住」的条数,输出类似 等你:1 卡住:0。
  2. 在 ~/.tmux.conf 里加上 set -g status-right '#(~/bin/ccs-count)' 和 set -g status-interval 15,执行 tmux source ~/.tmux.conf 生效。

这样不管你停在哪个会话里,右下角都会提醒还有几个会话在等你。需要离开电脑时的手机推送,可以接着看 手机 SSH 接管与完成通知 那篇,把 Notification 事件再接一条推送。

为什么要放在常开的 Mac mini 上

这块状态板有用的前提是:会话一直在,状态文件一直在更新。放在笔记本上,合盖、断网、换地方,会话一断,状态表就成了过期信息。

更稳的分工是:

  1. 多个 Claude Code 会话、仓库和状态文件都放在常开的新加坡整机独享 Mac mini 上。
  2. 你的笔记本或手机只负责 SSH 或 UU 远程连接进去看 ccs、处理「等你」的那几个。
  3. 机器本身要防休眠,否则「工作中」其实是被系统挂起了,可以配合 pmset 睡眠审计与心跳 一起用。
  4. 每台机器一个固定专属地址,浏览器即可 SSH / VNC,换设备也能接着看同一张表。

建议验收清单

  1. 每个任务都在命名 tmux 会话里运行,tmux ls 能一眼看出谁是谁。
  2. 新开会话发一句指令后,~/.claude-status/ 出现对应文件,状态为「工作中」。
  3. 触发一次权限确认,状态变为「等你」;回答结束后变为「已停下」;退出会话后记录消失。
  4. 故意让一个会话超过阈值没有动静,ccs 能把它标成「可能卡住」。
  5. 状态脚本出错时 Claude Code 照常工作,没有被 hook 拦住。

和 Zumac.Ai 怎么配合

多会话并行最需要的是一台不关机、不合盖、能随时连回去的机器。Zumac.Ai 提供位于新加坡家庭宽带上的实体 Mac mini,整机独享(一人一台物理机),支持 SSH 与 UU 远程连接,适合把多个 Claude Code 会话和这块状态板长期挂着。新客户整机租用 ¥999/月起(季付 ¥2,697.30,半年付 6 送 1 ¥5,994,年付 12 送 2 ¥11,988);已购买客户续费保持原价。订购与开通走 panel.zumac.ai;方案说明见 首页费用区;使用问题见 帮助中心。需要人工协助可联系 Telegram @singatao。实际延迟取决于你本地的网络线路。

让会话自己报告状态,你只处理真正需要你的那几个——并行才真的省时间。

Zumac.Ai 新加坡 Mac mini M6,整机独享,¥999/月起,联系 Telegram @singatao。
查看方案与费用 · 帮助中心

返回首页 · 更多文章

Telegram 客服