跳到主要内容
Jason Finance
AI 创业

一台主机运行多个 Claude Code Remote Control:Linux user、systemd 与 git worktree 分工

Claude Code 多个 Remote Control 运行在同一台主机:信任边界不同就分 Linux user,每个环境一个 systemd service,同一个 repo 的开发和写文章用 git worktree 分开,并说明 --spawn=worktree 的限制。

本文目录
  1. 1.Claude Code 多个 Remote Control:先决定要不要分 Linux 用户
  2. 2.同一个 repo:用 git worktree 开内容专用的工作目录
  3. 3.每个环境一个 systemd 服务
  4. 4.名称:–name、服务名称和对话标题是不同层次
  5. 5.–spawn=worktree 与 –capacity:要注意的事
  6. 6.三个环境怎么分工
  7. 7.其中一个起不来(status=1/FAILURE)时怎么排查
  8. 常见问题

我在 2026 年 10 月把几个项目的 Claude Code Remote Control 都放在 Oracle 的 Ubuntu ARM 主机上,用 systemd 常驻,手机的 Claude App 里能看到开发、内容、后台服务三个环境。这篇整理 Claude Code 多个 Remote Control 放在同一台主机时,用户、服务和工作目录怎么分。

先说结论:每个环境一个 systemd user service;信任程度不同的项目分给不同的 Linux 用户;同一个 repo 要同时做功能开发和写文章,用 git worktree 开第二个工作目录,不用另开 repo。 --spawn=worktree 分开的是工作目录,不是权限;要真正隔离,靠的是不同 Linux 用户、独立凭据和 GitHub 最小权限。

本文是我 2026 年 10 月的部署记录与整理,项目和用户名称都换成了 project-a 这类示例。Claude Code Remote Control 的参数以官方文档为准(2026 年 10 月 12 日查阅):需要 Pro、Max、Team 或 Enterprise 套餐,不支持 API key;Team 和 Enterprise 要由 Owner 在管理设置中开启。文中的做法不保证服务永远在线。

Claude Code 多个 Remote Control:先决定要不要分 Linux 用户

做法 优点 缺点 适合
每个项目一个 Linux 用户 各自的 ~/.claude/、SSH key、GitHub 授权、systemd 服务,权限容易分开 每个用户都要各自登录 Claude、设置 GitHub 生产环境、数据库等高风险项目
同一个用户、不同 repo 或 worktree 共用 Claude 登录和 GitHub CLI 授权,设置一次即可 没有操作系统层面的隔离,一个 session 读得到其他项目的文件 同一个人的多个低风险项目、同一 repo 的不同工作

systemd 的 NoNewPrivileges=true 这类设置也不是完整的沙箱,共用同一个 Linux 用户的 Remote Control 仍然可能互相读写对方能访问的文件。

创建项目用户并开启 linger(让服务不依赖登录):

sudo adduser --disabled-password --gecos '' project-a
sudo loginctl enable-linger project-a
loginctl show-user project-a -p Linger

每个新用户都要各自安装、登录 Claude Code,GitHub 的 SSH key 和 API 授权也要各自设置。读 Issue 需要的 API 授权,见《Git 可以 push,Claude Code 却读不到 GitHub Issues》。不要把别的用户的 ~/.claude/ 登录数据直接复制过来。

同一个 repo:用 git worktree 开内容专用的工作目录

我的情况是同一个网站 repo,想让一个 Remote Control 专心改代码、另一个专心写文章和做 SEO。做法是用 git worktree 从同一个 repo 开第二个工作目录,放在它自己的分支上。

# 在拥有 repo 的 Linux 用户下
cd ~/projects/project-a
git status -sb
git fetch origin

# 先确认分支是否已经存在
git branch --list 'content/editorial'
git branch -r --list 'origin/content/editorial'

# 只在 content/editorial 还不存在时执行
git worktree add -b content/editorial ~/projects/project-a-content origin/main

git worktree list

几条规则(git worktree 官方说明):

  • -b 会从指定的起点创建新分支,并在新的 worktree 检出。分支已经存在时,-b 会拒绝创建。 这时改用 git worktree add <路径> <既有分支>,不要硬加 -b。
  • 同一个分支不能同时在两个 worktree 检出,Git 默认会拒绝。
  • 新的 worktree 和原来的 repo 共用对象库和 refs,只有 HEAD、index 这类文件是各自的。

为什么不用 cp -r 复制一份?复制会连 .git 一起复制,变成两个各自独立的 repo,之后同步和分支关系都更难管理;worktree 共用同一个 Git 数据库,在哪个分支一目了然。

每个环境一个 systemd 服务

每个 Remote Control 一个 systemd user service,工作目录、显示名称各自设置。以内容用的 worktree 为例,在 project-a 用户下创建 unit 文件:

mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/claude-project-a-content.service <<'SERVICE_UNIT'
[Unit]
Description=Claude Code Remote Control - Project A Content
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
WorkingDirectory=/home/project-a/projects/project-a-content
ExecStart=/home/project-a/.local/bin/claude remote-control --name "VM1 - Project A - Content" --spawn=worktree
Restart=on-failure
RestartSec=15
Environment=HOME=/home/project-a
Environment=PATH=/home/project-a/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MemoryHigh=2500M
MemoryMax=3500M
NoNewPrivileges=true
UMask=0077

[Install]
WantedBy=default.target
SERVICE_UNIT

tail -n 4 ~/.config/systemd/user/claude-project-a-content.service
  • MemoryHigh、MemoryMax 是每个服务各自的上限,不是整台主机的总量。多个服务同时运行时,要根据主机实际内存调整。
  • 写完先确认文件末尾有 [Install]。我遇到过 heredoc 没有正确收尾、文件少了一段的情况。

第一次启动前,先切换到这个用户、进入工作目录手动运行一次 ~/.local/bin/claude remote-control --name "..." --spawn=worktree。第一次会问 Enable Remote Control? (y/n),看到 Connected 并在手机或网页上确认环境出现后,按 Ctrl+C 结束,再交给 systemd。

接着回到管理员账号启用服务。直接在 sudo -iu 的 shell 里执行 systemctl --user 可能出现 No medium found,要从管理员账号指定 user bus:

PROJECT_USER=project-a
uid=$(id -u "$PROJECT_USER")

sudo -u "$PROJECT_USER" \
  XDG_RUNTIME_DIR="/run/user/$uid" \
  DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
  systemctl --user daemon-reload

sudo -u "$PROJECT_USER" \
  XDG_RUNTIME_DIR="/run/user/$uid" \
  DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
  systemctl --user enable --now claude-project-a-content.service

原因和完整说明见《systemctl –user 出现 No medium found 怎么办》。新增、重启服务时只动要处理的那一个,不要一次重启全部,以免中断其他环境正在进行的工作。

官方文档也提到,server mode 下网络中断约 10 分钟后,claude remote-control 进程会结束,需要重新启动。Restart=on-failure 会不会把它拉起来,取决于进程结束的方式,要看 journal 确认,不要假设 systemd 能处理所有断线或登录失效。

名称:–name、服务名称和对话标题是不同层次

层次 在哪里设置 用途
Remote Control 环境名称 --name 参数 在 claude.ai/code 和 Claude App 的环境列表里显示
systemd 服务名称 unit 文件的文件名 在主机上管理、看日志
对话标题 Claude App 或网页里的每个 session 区分单次工作
Git 分支 git worktree add、git switch 决定修改落在哪里

建议固定一套命名规则,例如“主机 - 产品 - 角色”:VM1 - Project A - Development、VM1 - Project A - Content,服务名称对应为 claude-project-a.service、claude-project-a-content.service。手机上看到哪个环境,就知道该去主机上哪个服务看日志。

我当时在手机上看到三个环境,担心是不是有人改了名字。在 App 里改显示名称,一般不会改到 Git repo、分支或 unit 文件;但服务重启后名称怎么显示,要用当前的 Claude Code 版本实际确认,我不保证会保留新名称或恢复旧名称。

–spawn=worktree 与 –capacity:要注意的事

根据官方文档,--spawn 有 same-dir、worktree、session 几种模式。worktree 模式下,每个按需创建的 session 都有自己的 git worktree,所以工作目录必须是 git repo。--capacity 是同时 session 的上限,默认 32。我部署时,服务日志出现过 Capacity: 1/32 · New sessions will be created in an isolated worktree;那是当时的输出,不代表每个套餐或版本都一样。

三个常见的误会:

  1. 看错工作目录:新 session 在自己的 worktree 里,不一定在你创建的 content/editorial。开工前先确认:

    pwd && git status -sb && git worktree list
  2. 以为已经上线:commit 到分支不等于合并、部署。要确认 PR、CI 和部署状态。

  3. 以为不同 session 不会冲突:两个 Claude 仍然可能改到同一段代码或同一篇文章。事先分清文件归属,用 PR 审核合并。

--spawn=worktree 不是操作系统层面的隔离。同一个 Linux 用户下的 session,权限都一样。

三个环境怎么分工

我的部署最后分成三种工作,名称换成了通用说法:

环境 做什么 工作目录 GitHub 流程
开发 网站功能、前端、修 bug 网站 repo feature 分支 → PR
内容 文章、SEO、内容更新 同一个 repo 的独立 worktree content 分支或 feature 分支 → PR
后台服务 另一个独立项目的后端 独立的 repo 更严格的审核和部署权限

内容环境不应该“顺手”去改数据库 schema、账号权限、环境变量或生产部署设置。只靠在 CLAUDE.md 里写规则不是技术上的访问控制,需要硬隔离时,用不同 Linux 用户、独立凭据和 GitHub 最小权限。共用 repo 的 CLAUDE.md 会影响所有 worktree;只想给内容环境的写作规范,可以放在独立文件里,开工时明确引用。

手机上看到三个名称,不等于三个服务都在运行。 我 2026 年 10 月 11 日的一份终端记录里,开发环境是 active (running),后台服务当时是 inactive (dead)。所以每次调整后,三个服务都要各自检查一次。

其中一个起不来(status=1/FAILURE)时怎么排查

我遇到过同一个 Linux 用户下,一个 Remote Control 正常连接,另一个启动后很快就结束,systemd 显示 code=exited, status=1/FAILURE。手上的日志不足以确认根因,也不能因此说“同一个用户不能运行两个 Remote Control”。排查顺序:

# 在管理员账号:1. 先停掉失败的那一个,避免反复重试干扰判断
PROJECT_USER=project-a
SERVICE=claude-project-a-content.service
uid=$(id -u "$PROJECT_USER")

sudo -u "$PROJECT_USER" \
  XDG_RUNTIME_DIR="/run/user/$uid" \
  DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
  systemctl --user stop "$SERVICE"

# 2. 读最近的日志,不要只看 status 的最后几行
sudo -u "$PROJECT_USER" \
  XDG_RUNTIME_DIR="/run/user/$uid" \
  DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$uid/bus" \
  journalctl --user -u "$SERVICE" -n 100 --no-pager

# 3. 用同一个用户、同一个工作目录手动运行,看实际错误
sudo -iu "$PROJECT_USER"
cd ~/projects/project-a-content
~/.local/bin/claude remote-control --name "VM1 - Project A - Content" --spawn=worktree

可以逐项用日志验证的检查:Claude 登录状态、CLI 版本、工作目录是否存在且是 git repo、用户的 HOME 和 PATH、是否还没回答 Enable Remote Control?、网络、内存,以及是否已经有同名的进程在运行。官方文档列出的错误信息里,没有登录或用的不是 claude.ai 订阅时会出现 You must be logged in to use Remote Control;环境变量设置了 ANTHROPIC_API_KEY 时会出现 Remote Control requires claude.ai subscription auth.。手动运行也失败的话,保留具体的错误文字,不要去猜是 OAuth、网络还是同时 session 的上限。

主机、Claude Code 安装和第一个常驻服务的完整步骤,见《Oracle Cloud 搭建 Claude Code Remote Control 常驻教程》;这些工具在整个网站中的角色,见《Jason Finance 从零到一》。

常见问题

一台主机可以运行多个 Claude Code Remote Control 吗?

可以。做法是每个环境一个 systemd user service,各自用 --name 设置在 Claude App 列表里显示的名称、各自指定工作目录。我 2026 年 10 月的部署就在同一台 Ubuntu ARM 主机上运行了多个 Remote Control 服务,但这不保证每个服务永远在线、不需要维护。

多个 Remote Control 要用不同 Linux 用户,还是同一个?

看信任边界。不同用户各有自己的 Claude 登录、SSH key、GitHub 授权和 systemd 服务,隔离更好,但每个都要重新认证。同一个用户更方便,但所有项目共用操作系统权限;处理生产环境、数据库这类高风险项目时,应该分开用户并给最小权限。

同一个 GitHub repo 怎么把开发和写文章分开?

不用另开 repo,用 git worktree 从同一个 repo 建第二个工作目录,放在它自己的分支上,例如 content/editorial,再为它建一个独立的 Remote Control 服务。创建前先确认分支不存在,已存在就不要用 -b。

--spawn=worktree 是什么?可以当作隔离吗?

--spawn=worktree 让 Remote Control 每个按需创建的 session 都有自己的 git worktree,需要在 git repo 里运行。它隔离的是工作目录,不是操作系统权限,也不保证 session 一定在你预期的分支上,开 PR 前要检查分支和 diff。

--capacity 默认是多少?

官方说明 --capacity 是同时 session 的上限,默认 32。我部署时的日志曾显示 Capacity: 1/32,那是当时的输出,不代表每个套餐或版本都一样。

在手机上改了 Remote Control 的名称,会影响 repo 或服务吗?

对话标题、环境显示名称、--name 参数和 systemd 服务名称是不同层次。改 App 里的显示名称一般不会改到 Git repo、分支或 unit 文件,但服务重启后名称怎么显示,要用当前的 Claude Code 版本实际确认。

延伸阅读

关于作者

Jason 的照片

Jason

Google 大客户销售客户经理、哥伦比亚大学 MBA 录取者,分享自己实际用过的理财工具与经验。

留言

使用 Google 登录即可留言。留言“不会”使用您的 Google 头像或姓名,对外显示的昵称是系统随机生成的代号,以保护您的隐私。

登录即表示你同意本站的隐私政策。

  1. 加载留言中…