Computer-Use 机器级独占锁与生命周期(v2.1.195 之后的会话级锁设计)

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 进程托管,整个时序如下:

  1. 用户在交互式会话中执行 /mcp,找到 computer-use 服务器并启用;
  2. Claude Code 首次调用 computer-use 工具时,向 machine-wide lock 文件写入当前 session_id;
  3. 同一台机器上的其他会话再次调用 computer-use 时,Claude Code 检查到锁已被持有并返回错误;
  4. 当前会话退出(/exit、终端关闭、进程被杀),锁自动释放;
  5. 如果当前会话崩溃,Claude Code 会检测进程不在运行,强制释放锁。

第 5 步是崩溃安全:会话非正常退出时,锁不会僵死。官方明确写了”crashed session 的锁会自动释放”,所以”忘记退出会话导致锁卡住”在崩溃场景下不会发生,但正常忘退依然会卡住,这一点务必与”异常崩溃”区分开。

五、与锁配套的四个安全护栏

锁只是 Computer-Use 安全模型中的一层。官方同时提供了四类护栏,共同组成纵深防御。

  1. 按 app 授权:每控制一个新 app 都必须在终端内显式批准,且只在当前会话有效;
  2. Sentinel 警告:Terminal、iTerm、VS Code、System Settings 这类高危 app 在授权时会显示额外提示,把”等同于 shell 访问””可改系统设置”等风险写在 prompt 里;
  3. 终端排除截图:Claude 自己的终端窗口被排除在截图之外,避免会话输出被自身读取形成反馈环;
  4. 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 进程,锁会随进程检测自动释放。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 qiqicto@qq.com 举报,一经查实,本站将立刻删除。
赞 (0)
拓扑大师的头像拓扑大师普通用户

相关推荐

返回顶部