2026-06-09 23:15:17 +08:00
|
|
|
|
---
|
|
|
|
|
|
tags: [daemon, supervisor, 后台守护, worker, claude-code]
|
|
|
|
|
|
create time: 2026-06-09 22:30
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2026-06-08 23:08:57 +08:00
|
|
|
|
# DAEMON — 后台守护进程
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
## 概述
|
|
|
|
|
|
|
|
|
|
|
|
DAEMON 将 Claude Code 变为后台守护进程。主进程(supervisor)管理多个 worker 子进程的生命周期,通过文件系统状态文件进行通信。适用于持续运行的后台服务场景(如配合 BRIDGE_MODE 提供远程控制服务)。
|
|
|
|
|
|
|
|
|
|
|
|
> [!info]
|
2026-06-08 23:08:57 +08:00
|
|
|
|
> Feature Flag: `FEATURE_DAEMON=1`
|
|
|
|
|
|
> 实现状态:Supervisor 和 remoteControl Worker 已实现
|
|
|
|
|
|
> 引用数:3
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
## 正文
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 实现架构
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 模块状态
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
| 模块 | 文件 | 状态 |
|
|
|
|
|
|
|------|------|------|
|
|
|
|
|
|
| 守护主进程 | `src/daemon/main.ts` | **已实现** — Supervisor 含子命令、Worker 生命周期管理、指数退避重启 |
|
|
|
|
|
|
| Worker 注册 | `src/daemon/workerRegistry.ts` | **已实现** — remoteControl Worker(headless bridge) |
|
|
|
|
|
|
| Daemon 状态 | `src/daemon/state.ts` | **已实现** — PID/状态文件的读写与查询 |
|
|
|
|
|
|
| CLI 路由 | `src/entrypoints/cli.tsx` | **布线** — `--daemon-worker` 和 `daemon` 子命令 |
|
|
|
|
|
|
| 命令注册 | `src/commands.ts` | **布线** — DAEMON + BRIDGE_MODE 门控 |
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### CLI 入口
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
```bash
|
2026-06-08 23:08:57 +08:00
|
|
|
|
# 启动守护进程
|
|
|
|
|
|
claude daemon start
|
|
|
|
|
|
|
|
|
|
|
|
# 查看状态(默认子命令)
|
|
|
|
|
|
claude daemon status
|
|
|
|
|
|
claude daemon ps
|
|
|
|
|
|
|
|
|
|
|
|
# 停止守护进程
|
|
|
|
|
|
claude daemon stop
|
|
|
|
|
|
|
|
|
|
|
|
# 以 worker 身份启动(由 supervisor 自动调用)
|
|
|
|
|
|
claude --daemon-worker=remoteControl
|
|
|
|
|
|
|
|
|
|
|
|
# 后台会话管理
|
|
|
|
|
|
claude daemon bg
|
|
|
|
|
|
claude daemon attach <session>
|
|
|
|
|
|
claude daemon logs <session>
|
|
|
|
|
|
claude daemon kill <session>
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 架构
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
```mermaid
|
|
|
|
|
|
graph TD
|
|
|
|
|
|
A["Supervisor daemonMain"] --> B["Worker: remoteControl"]
|
|
|
|
|
|
B --> C["runBridgeHeadless 远程控制 headless 模式"]
|
|
|
|
|
|
C --> D["接收远程会话、处理消息、权限审批"]
|
|
|
|
|
|
A --> E["文件系统状态文件 daemon-state.json"]
|
|
|
|
|
|
E --> F["PID、CWD、启动时间、Worker 类型"]
|
|
|
|
|
|
E --> G["queryDaemonStatus / stopDaemonByPid"]
|
2026-06-08 23:08:57 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### Worker 生命周期管理
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
Supervisor 为每个 worker 实现:
|
2026-06-09 23:15:17 +08:00
|
|
|
|
|
2026-06-08 23:08:57 +08:00
|
|
|
|
- **指数退避重启**:初始 2s,上限 120s,倍数 ×2
|
|
|
|
|
|
- **快速失败检测**:10s 内连续崩溃 5 次则 parking(不再重启)
|
|
|
|
|
|
- **永久错误退出码**:78 (EXIT_CODE_PERMANENT) 导致直接 parking
|
|
|
|
|
|
- **优雅关闭**:SIGTERM/SIGINT → abort signal → 30s 强制 SIGKILL
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
#### 与 BRIDGE_MODE 的关系
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
DAEMON 和 BRIDGE_MODE 常组合使用:
|
|
|
|
|
|
|
|
|
|
|
|
```ts
|
|
|
|
|
|
// src/commands.ts
|
|
|
|
|
|
if (feature('DAEMON') && feature('BRIDGE_MODE')) {
|
|
|
|
|
|
// 加载 remoteControlServer 命令
|
|
|
|
|
|
}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
> [!warning]
|
|
|
|
|
|
> 双重门控:两个 feature 都需要开启才能使用远程控制服务器。
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 关键设计决策
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
1. **多进程架构**:一个 supervisor + 多个 worker,进程隔离
|
|
|
|
|
|
2. **文件系统状态通信**:通过 `daemon-state.json` 文件进行状态共享(非 Unix 域套接字)
|
|
|
|
|
|
3. **与 BRIDGE_MODE 强绑定**:守护进程最常见的用途是提供远程控制服务
|
|
|
|
|
|
4. **CLI 子命令路由**:`daemon` 子命令和 `--daemon-worker` 参数在 `cli.tsx` 中路由
|
|
|
|
|
|
5. **Worker 环境变量**:supervisor 通过环境变量(`DAEMON_WORKER_*`)向 worker 传递配置
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 使用方式
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# 启用守护进程模式
|
|
|
|
|
|
FEATURE_DAEMON=1 FEATURE_BRIDGE_MODE=1 bun run dev
|
|
|
|
|
|
|
|
|
|
|
|
# 启动守护进程
|
|
|
|
|
|
claude daemon start
|
|
|
|
|
|
|
|
|
|
|
|
# 查看状态
|
|
|
|
|
|
claude daemon status
|
|
|
|
|
|
|
|
|
|
|
|
# 停止守护进程
|
|
|
|
|
|
claude daemon stop
|
|
|
|
|
|
|
|
|
|
|
|
# 以特定 worker 启动(通常由 supervisor 自动调用)
|
|
|
|
|
|
claude --daemon-worker=remoteControl
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2026-06-09 23:15:17 +08:00
|
|
|
|
### 文件索引
|
2026-06-08 23:08:57 +08:00
|
|
|
|
|
|
|
|
|
|
| 文件 | 职责 |
|
|
|
|
|
|
|------|------|
|
|
|
|
|
|
| `src/daemon/main.ts` | Supervisor 主进程:子命令分发、Worker 生命周期管理、退避重启 |
|
|
|
|
|
|
| `src/daemon/workerRegistry.ts` | Worker 入口:remoteControl worker 实现 |
|
|
|
|
|
|
| `src/daemon/state.ts` | Daemon 状态管理:PID 文件读写、状态查询 |
|
|
|
|
|
|
| `src/entrypoints/cli.tsx` | CLI 路由 |
|
|
|
|
|
|
| `src/commands.ts` | 命令注册(双重门控) |
|
2026-06-09 23:15:17 +08:00
|
|
|
|
|
|
|
|
|
|
## 关联笔记
|
|
|
|
|
|
|
|
|
|
|
|
- [[bridge-mode]]
|
|
|
|
|
|
- [[daemon-restructure-design]]
|
|
|
|
|
|
- [[remote-control-self-hosting]]
|