macOS 重啟後 /tmp 被清空 → tmux socket 消失 → 所有 tmux session 全滅。
本 skill 用三層架構解決這個問題。
skills/service-persistence/
├── SKILL.md ← 本文件(方法論 + 操作流程)
├── service-registry.json ← 本機服務名單(symlink 到 workspace 根目錄)
├── scripts/
│ ├── bootstrap-services.sh ← 實際在跑的 Tier 2 bootstrap script
│ └── restore-claude-telegram.sh ← 實際在跑的 Tier 3 wrapper daemon script
└── references/
├── registry-spec.md ← service-registry.json 格式規格
├── launchagent-template.md ← plist 模板(3 種)
├── bootstrap-template.md ← bootstrap script 通用模板
└── wrapper-template.md ← wrapper daemon 通用模板
實際部署位置:
~/.openclaw/scripts/(LaunchAgent 引用的路徑)~/Library/LaunchAgents/~/.openclaw/workspace/service-registry.json修改 skill 裡的 script 後,必須同步複製到部署位置。
適用條件(符合任一):
特性:
RunAtLoad: true → 開機自動起KeepAlive: true → process 掛掉自動重拉plist 模板:見 references/launchagent-template.md
適用條件:
特性:
/tmp/openclaw-tmux/openclaw.sockKeepAlive: false)開機跑一次 bootstrap實際 script:scripts/bootstrap-services.sh
通用模板:references/bootstrap-template.md
適用條件:
特性:
KeepAlive: true),每 N 秒檢查zsh/bash = 程式退出了)實際 script:scripts/restore-claude-telegram.sh
通用模板:references/wrapper-template.md
/ 或 ~ps aux 驗證真實指令,不要憑記憶寫references/wrapper-template.md 改KeepAlive: true| socket | 路徑 | 誰用 | tmux ls 看得到 |
|---|---|---|---|
| --- | --- | --- | --- |
| 預設 | /tmp/tmux-$(id -u)/default | 人手動操作 | ✅ |
| OpenClaw | /tmp/openclaw-tmux/openclaw.sock | Agent 管理 | ❌ 要加 -S |
原則:人需要經常 attach 的 → 預設 socket。Agent 管的 → OpenClaw socket。
位置:~/.openclaw/workspace/service-registry.json(skill 目錄有 symlink)
這份 JSON 定義這台機器所有需要持久化的服務,包含:
結構和欄位說明:見 references/registry-spec.md
每次新增 / 移除 / 修改服務,都必須更新這份 registry。
service-registry.json 新增 entry~/Library/LaunchAgents/ → launchctl loadscripts/bootstrap-services.sh 加新 session → 複製到部署位置launchctl load# Tier 1
launchctl list | grep <label>
tail -20 ~/.openclaw/logs/<service>.err.log
# Tier 2
tmux -S /tmp/openclaw-tmux/openclaw.sock has-session -t <session>
tmux -S /tmp/openclaw-tmux/openclaw.sock capture-pane -pt <session>:0.0 | tail -20
# Tier 3
launchctl list | grep <wrapper-label>
tail -20 ~/.openclaw/logs/<wrapper>.log
tmux list-panes -t <session> -F '#{pane_current_command}'
# 如果是 zsh/bash = 程式退出了,wrapper 應該會自動重建
# 如果 wrapper 也沒在跑 = LaunchAgent 掛了
任何 infra 變更必須同步更新:
service-registry.json~/.openclaw/RECOVER-SERVICES.md不更新 = 任務未完成。
LaunchAgent 的預設 PATH 是 /usr/bin:/bin:/usr/sbin:/sbin,不包含:
/opt/homebrew/bin(brew 安裝的工具)~/.bun/bin(bun)~/.local/bin、~/.cargo/bin 等用戶級工具所有 script 的 export PATH 必須包含服務依賴的所有 binary 路徑。
踩坑紀錄(2026-04-09):Claude Code Telegram 的 plugin 用 bun 跑,但 wrapper script PATH 沒有 ~/.bun/bin → plugin 啟動失敗 → Claude 顯示 Listening 但實際不收訊息。表面看正常,底層 subprocess 全死。debug log 才看到 Executable not found in $PATH: "bun"。
~/.openclaw/scripts/),修改後必須同步ps aux | grep bun)共 1 个版本