跳到主要內容
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. 載入留言中…