Computer-Use 在 CLI 里通过 /mcp 启用后,会在同一台 macOS 机器上获取一把”机器级独占锁”,目的是阻止两个 Claude Code 会话同时抢鼠标键盘。从 v2.1.195 起,这把锁的生命周期被进一步收窄——只有在当前会话退出时才会释放,单次操作完成不再释放。下面把”为什么必须独占”和”为什么生命周期要绑到会话”两个问题拆开讲清楚。
一、Computer-Use 锁的两层语义
理解这把锁的关键,是把它和”应用授权”分开。Computer-Use 同时维护两类资源:
- 应用授权:每个 app 在当前会话内被显式批准,离开会话即失效;
- 机器级独占锁:同一时刻只能有一个会话持有锁,控制屏幕与输入设备的独占访问。
两类资源互相配合:应用授权决定 Claude 能不能碰某个 app,机器级锁决定哪个会话能”现在”碰屏幕。
| 维度 | 应用授权 | 机器级独占锁 |
|---|---|---|
| 粒度 | 按 app 划分 | 整台机器 |
| 作用期 | 当前会话内 | 从首次 computer-use 动作到当前会话退出 |
| 失效时机 | 会话结束 | 会话退出(v2.1.195 之后) |
| 触发授权方式 | 终端内交互提示 | 第二个 Claude Code 启动 computer-use 时收到错误 |
需要特别注意的是,”会话”在 Claude Code 里指的是 /exit 或进程结束这一级生命周期,不是单条 user prompt 也不是一次工具调用。这层语义决定了锁的释放时机。
二、为什么必须用机器级独占锁
Computer-Use 直接操控 macOS 桌面,包含鼠标点击、键盘输入、滚轮、拖拽。如果两个会话同时持锁,结果是不可预测的:双方会把点击事件投到同一坐标、按键会互相覆盖、UI 状态会被另一个会话撕扯。
锁的真正作用不是”防止做坏事”,而是”防止两套操作在同一界面上打架”。官方把这种模式叫做”一次一个会话”(one session at a time),并配了如下错误提示:
Computer use is in use by another Claude session
当第二个会话试图启用 computer-use 时,错误信息会告诉用户是哪条会话持有锁,应该先退出那条会话。锁检测在 computer-use MCP server 启动时就会做,因此不需要等到具体动作执行才发现冲突。
三、v2.1.195 之前 vs 之后:锁的释放时机变了
v2.1.195 是一个分水岭版本,主要的差异在锁生命周期:
- v2.1.195 之前:每次 computer-use 任务完成,锁就释放;下一个会话可以立即接手;
- v2.1.195 之后:锁从首次 computer-use 动作开始持有,直到当前会话退出才释放;单次任务完成不再释放。
这个调整背后有清晰的工程理由:避免”长任务中途被另一个会话穿插”造成状态错乱。在旧版本下,A 会话执行”打开 Xcode 编译、再点 Preferences”的链路,B 会话在中间接走锁,A 的下一步操作就会落到 B 的界面上,行为完全不可预测。把生命周期绑到会话上后,A 与 B 必须先后排队。
| 版本段 | 锁的持有范围 | 释放时机 | 风险 |
|---|---|---|---|
| v2.1.195 之前 | 单次 computer-use 任务 | 任务完成 | 长链路中可能被穿插 |
| v2.1.195 之后 | 整个会话 | 会话退出 | 会话不退出则阻塞其他会话 |
四、锁的获取与释放时序
锁的获取与释放由 Claude Code 进程托管,整个时序如下:
- 用户在交互式会话中执行
/mcp,找到 computer-use 服务器并启用; - Claude Code 首次调用 computer-use 工具时,向 machine-wide lock 文件写入当前 session_id;
- 同一台机器上的其他会话再次调用 computer-use 时,Claude Code 检查到锁已被持有并返回错误;
- 当前会话退出(
/exit、终端关闭、进程被杀),锁自动释放; - 如果当前会话崩溃,Claude Code 会检测进程不在运行,强制释放锁。
第 5 步是崩溃安全:会话非正常退出时,锁不会僵死。官方明确写了”crashed session 的锁会自动释放”,所以”忘记退出会话导致锁卡住”在崩溃场景下不会发生,但正常忘退依然会卡住,这一点务必与”异常崩溃”区分开。
五、与锁配套的四个安全护栏
锁只是 Computer-Use 安全模型中的一层。官方同时提供了四类护栏,共同组成纵深防御。
- 按 app 授权:每控制一个新 app 都必须在终端内显式批准,且只在当前会话有效;
- Sentinel 警告:Terminal、iTerm、VS Code、System Settings 这类高危 app 在授权时会显示额外提示,把”等同于 shell 访问””可改系统设置”等风险写在 prompt 里;
- 终端排除截图:Claude 自己的终端窗口被排除在截图之外,避免会话输出被自身读取形成反馈环;
- Esc 全局中止:任何地方按 Esc 立即中止当前操作,且按键被消费掉,防止 prompt 注入用 Esc 关闭对话框。
锁负责”独占”,授权负责”能碰哪些 app”,两者正交,共同决定一次 computer-use 操作的最终范围。
六、工程实践:被锁卡住怎么办
官方列出了三类常见卡锁场景与对应解法。
// 1) 另一会话占着锁:先退出会话
> Computer use is in use by another Claude session
-> 在另一终端中 /exit 那个会话
// 2) 之前会话崩溃但锁未释放:重启 Claude Code 自动清理
> 杀掉残留的 claude 进程后重启会话
// 3) macOS 权限提示反复弹
> 退出 Claude Code,重新打开终端,再次启用 computer-use
-> 系统设置 > 隐私与安全 > 屏幕录制 中确认终端 app 已勾选
如果是”两个会话都想用 computer-use”的并发需求,官方建议的解决办法是排队而不是同时:把一个会话的任务先 /exit,再让另一个会话开始。不是给锁再加排队接口,而是从协议层强制串行化。
常见问题(FAQ)
Q1:Computer-Use 锁是机器级还是会话级?
机器级。同台机器同一时刻只能有一个 Claude Code 会话持有锁。
Q2:v2.1.195 之后,任务完成会自动释放锁吗?
不会。v2.1.195 之后,锁只在当前会话退出时释放,单次任务完成不再释放。
Q3:锁卡住时怎么释放?
正常情况让占锁的会话 /exit;崩溃场景下杀掉残留的 claude 进程,锁会随进程检测自动释放。