运行时

什么是守护进程

守护进程是运行在你机器上的任务调度程序,负责发现 Provider CLI、接收任务、派发执行、收集结果并维持与服务器的连接。

什么是守护进程

守护进程(Daemon)是运行在你机器上的一个常驻程序,由 mopheus daemon start 启动。它是 Mopheus 任务执行链路中承上启下的核心组件。

简单来说:守护进程是发动机,Provider CLI 是执行引擎。

守护进程本身不直接执行智能体的具体工作(如写代码、查数据库),它的核心职责是调度:发现本机上的 Provider CLI,从服务器接收任务,把任务派发给对应的 Provider CLI 去执行,然后将结果回传给服务器。

通过 systemd service 安装时,daemon 生命周期由 service cgroup 管理。每个 Linux 智能体任务使用独立进程组,并在可用时使用委派的 cgroup v2 scope 执行取消;daemon 不会为每个任务额外创建 supervisor 进程。

每台主机一个守护进程 一个守护进程可发现多个 Provider CLI 每个 Provider CLI 可被多个智能体引用 智能体可以同时处理多个任务(受 maxConcurrentAgentTasks 限制) 任务是指每次通过工单/Chat 触发智能体运行产生的执行记录

守护进程的职责

职责说明
发现 Provider CLI启动时扫描本机已安装的 CLI(claudekimi-code 等),并每 30 秒重新探测一次。
注册运行时为每个发现的 Provider CLI 向 Mopheus 服务器注册运行时记录。
接收任务通过 WebSocket 接收服务器的任务派发通知,竞争认领任务。
派发执行将任务交给对应的 Provider CLI 去实际执行。
收集结果捕获 Provider CLI 的输出、文件变更等,回传给服务器。
心跳保活每 30 秒向服务器发送 HTTP 心跳,报告"我还活着"。
工作目录管理为每个任务创建独立的工作目录,任务结束后按需清理。

守护进程、运行时、Provider CLI 三者的关系

这是 Mopheus 中最容易混淆的三个概念,用一句话总结:

  • Provider CLI(如 ClaudeCode、KimiCode)= 执行引擎,实际执行任务的程序
  • 守护进程mopheus daemon start)= 发动机/调度员,发现 Provider CLI、接单、派单、收集结果
  • 运行时 = 台账,Provider CLI 在 Mopheus 平台上的映射记录

一个更具体的例子:

  1. 你在笔记本上安装了 claude(ClaudeCode CLI)
  2. 启动 mopheus daemon start
  3. 守护进程发现 claude 可执行文件存在
  4. 守护进程向服务器注册:"我这台机器上有个 claude"
  5. 服务器创建一条 运行时 记录:"claude @ 你的笔记本"
  6. 服务器把任务派发给 守护进程
  7. 守护进程把任务交给 claude 去执行
  8. claude 写代码、查数据库、改文件(真正的任务执行)
  9. 守护进程claude 的输出回传给服务器

每台机器只需要(也只能)运行一个守护进程。界面上可能显示多个运行时,但后台始终只有 1 个守护进程

心跳

守护进程通过一组后台 goroutine 维持与服务器的连接和运行时状态同步:

  1. 定时拉取工作空间——守护进程定期从服务器获取当前用户的工作空间列表,确保本地感知最新的工作空间。
  2. 注册运行时——对每个工作空间 × Provider CLI 组合,向服务器注册一条归属于当前用户的 Runtime 记录。新记录默认禁用,需要 Runtime Owner 在每个工作区中主动启用。
  3. 运行时定时心跳上报——每条运行时独立维护一个心跳协程,每 30 秒向服务器发送心跳。各协程互不干扰,一条运行时的心跳延迟不影响其他运行时。
  4. 后台处理心跳和清理死运行时——服务器端只刷新已启用 Runtime 的心跳状态;禁用 Runtime 即使 Daemon 仍在运行,也保持不可用。已启用 Runtime 若超过 90 秒无心跳则标记为离线;守护进程侧收到 404(运行时已不存在)时进入 30s 合并窗口触发重新注册,若仍失败则退避 60s 后重试。清理不会删除仍有活跃任务或直接智能体绑定的 Runtime。若旧记录已被清理,重新创建的记录默认禁用,需要 Owner 再次激活。

任务执行

任务的并发、调度、超时、重试、停止和重启恢复统一说明请参见 Daemon 任务执行

守护进程的生命周期

# 启动 —— 扫描 Provider CLI、注册运行时、开始接收任务
mopheus daemon start

# 查看状态 —— 是否正常运行、连接了哪些工作区
mopheus daemon status

# 查看日志 —— 排查连接错误、任务执行问题
mopheus daemon logs

# 停止 —— 优雅注销所有运行时,界面上显示离线
mopheus daemon stop

# 重启 —— 等待运行中任务完成后再启动
mopheus daemon restart

工作目录 GC

任务目录、成功后的 worktree 清理,以及周期性 GC 的职责和配置请见工作目录与清理

文件系统沙箱

沙箱的挂载边界、同一工作区内的协作范围、跨工作区隔离、个人配置文件下发及降级行为请见文件系统沙箱

运行时资源守护与熔断(Runtime Task Guard & Watchdog)

资源采集与熔断、配置优先级以及取证诊断请见运行时资源守卫

故障排查

守护进程启动后运行时没有出现

  • 检查 Provider CLI 是否在 $PATH 中:which claude
  • 查看守护进程日志:mopheus daemon logs
  • 确认 mopheus login 已成功:mopheus ticket list

任务派发后没有执行

  • 检查守护进程状态:mopheus daemon status
  • 查看 Provider CLI 是否正常运行:claude --version
  • 检查并发槽位是否已满:守护进程默认最多同时执行 20 个任务

守护进程断线

  • 守护进程每 30 秒发送一次心跳,若 90 秒内无心跳则显示离线
  • 检查网络连接:curl $MOPHEUS_SERVER_URL/health
  • 如果是代理环境,设置 HTTPS_PROXY

任务用量按 (agent_task_id, model) 保存为一份幂等的最终快照。CLI 重复上报会覆盖当前任务快照;工作区和 Agent 的日统计仍会跨不同任务累计。

命令行参考

与守护进程生命周期管理相关的常用 CLI 命令参考:

mopheus daemon start                        # 启动守护进程(后台运行并自动发现 Provider CLI)
mopheus daemon start --foreground           # 前台运行守护进程(实时输出控制台日志)
mopheus daemon status                       # 查看守护进程运行状态、PID 及已发现的 Provider
mopheus daemon logs                         # 查看守护进程历史日志
mopheus daemon logs -f                      # 实时跟踪守护进程日志流
mopheus daemon restart                      # 重启守护进程
mopheus daemon stop                         # 优雅停止守护进程(等待运行中任务结束)