Files
2026-03-27 17:08:58 +08:00

8.3 KiB

Watchdog 项目 PRD

1. 项目概述

本项目目标是实现一个运行于 Linux 平台的守护型看门狗程序,用于监控一个或多个目标程序的运行状态,并在目标程序异常退出、未启动或持续不稳定时,按照预定义策略执行重启与回退。该程序首先服务于 Linux arm64 部署场景,要求支持在 x64 开发环境中交叉编译到 arm64 设备运行。系统设计时需保留未来扩展到 Windows 的可能,但第一版本不承担 Windows 兼容实现。

该项目不负责业务程序本身的逻辑,不承担升级平台、远程编排、图形界面或复杂运维平台职责。其定位是一个本地进程守护与回退执行器,提供稳定、可预测、可测试的最小核心能力。

2. 项目目标

第一版本的核心目标如下:

  1. 支持监控多个目标程序。
  2. 支持通过轮询方式检测程序是否处于有效运行状态。
  3. 支持在目标程序未运行时自动拉起。
  4. 支持对频繁崩溃或持续启动失败的程序执行 fallback。
  5. fallback 顺序固定,但每一级 fallback 的目标内容由配置指定。
  6. fallback 为临时运行时切换,不持久化到磁盘。
  7. 支持固定 CLI 子命令执行。
  8. 支持 stdout/stderr 日志输出。
  9. 支持单元测试,保证核心状态机与策略逻辑可验证。

3. 非目标

第一版本明确不做以下内容:

  • 不支持任意 shell 指令编排。
  • 不支持动态插件系统。
  • 不支持配置热更新。
  • 不支持远程管理与网络 API。
  • 不支持安装包管理、升级平台和复杂版本治理。
  • 不支持集成测试框架自动化,仅要求单元测试。
  • 不支持所有极端失败场景的复杂恢复决策;若最终 fallback 目标仍无法启动,则系统持续尝试最后一级 fallback 即可。

4. 核心业务场景

4.1 目标程序未启动

看门狗轮询检测目标程序状态;若检测失败,系统尝试执行该目标当前激活版本的启动命令。

4.2 目标程序启动后短时间退出

若程序启动后未达到“稳定运行判定窗口”,则该次行为视为启动失败,不计入 crash。

4.3 目标程序稳定运行后退出

若程序已连续存活至少 5 秒,再发生退出,则视为一次 crash 事件。看门狗根据配置统计检测窗口内 crash 次数,达到阈值后触发 fallback。

4.4 目标程序持续不稳定

当一个目标在给定检测窗口内达到阈值,例如默认 1 分钟内 3 次 crash,则切换到固定顺序中的下一级 fallback 目标。

4.5 fallback 已触发

一旦某目标切换到 fallback,除非整个 watchdog 进程重启,否则不主动恢复到主目标。系统继续守护当前 fallback 目标;若仍失败,则继续向后切换,直到最终 fallback 目标。最终 fallback 目标若仍无法启动,则持续尝试该最终目标。

5. 功能需求

5.1 多目标监控

系统需支持多个目标程序并发受管。第一版本允许采用单线程轮询模型,即每一轮按顺序遍历所有目标,分别执行检测、重启和 fallback 决策。每个目标需维护独立运行状态,互不影响。

5.2 启动方式

所有目标及 fallback 均采用 exec 方式启动。即配置明确给出:

  • 可执行文件路径
  • 参数列表
  • 可选工作目录

第一版本不通过 shell 解释器启动,不依赖 sh -c 或类似方式,以降低转义复杂度、不确定性和命令注入风险。

5.3 检测机制

检测机制采用“provider + 配置项”的方式实现。第一版本不构建高度抽象的通用组合 DSL,而是定义若干固定检测方法,每个方法对应明确配置字段。一个目标可配置多个检测方法;所有检测方法均通过时,视为目标当前健康。

已确认需要支持或预留的检测维度包括:

  • 进程是否存在
  • 程序文件是否存在
  • PID 文件是否存在
  • 指定文件是否存在

“检测程序是否存在”属于检测条件之一,不等同于进程是否存在。

5.4 稳定运行与 crash 判定

系统需定义稳定运行窗口。当前约定为 5 秒:

  • 启动后若存活不足 5 秒即退出,视为启动失败。
  • 启动后若连续运行至少 5 秒再退出,视为 crash。

看门狗需统计检测窗口中的 crash 事件次数。默认策略为“1 分钟内 3 次 crash 触发 fallback”,该阈值与窗口长度应允许通过配置覆盖。

5.5 fallback 机制

fallback 顺序固定,第一版本定义为:

  1. 主目标
  2. 上一个版本
  3. 更新后的出厂版本
  4. 出厂版本

配置文件负责指定每一级实际启动目标,不负责改写顺序。fallback 的本质是运行时切换当前激活目标,不修改持久化配置、不覆盖原始程序文件、不执行安装动作。切换后仅影响当前 watchdog 生命周期内的行为。

5.6 CLI 子命令

程序需支持固定 CLI 子命令。第一版本至少应考虑以下命令集合:

  • run:启动 watchdog 主循环
  • check:执行一次检测
  • start:手动启动指定目标
  • check-env:检测运行环境

是否进一步开放 fallback 相关手工命令可在后续迭代决定,但不作为第一版本必需能力。

5.7 日志

第一版本日志输出目标为 stdout/stderr。日志需要覆盖以下关键信息:

  • watchdog 启动与退出
  • 每个目标的检测结果
  • 启动尝试
  • 启动失败
  • 稳定运行判定通过
  • crash 事件记录
  • fallback 切换
  • 最终 fallback 持续尝试

后续如需写文件或接入 journald,应通过独立日志层扩展,而不影响核心状态机。

5.8 测试

必须提供单元测试,覆盖以下核心逻辑:

  • 启动成功与启动失败判定
  • 稳定运行 5 秒后的 crash 判定
  • 检测窗口内 crash 计数
  • fallback 触发阈值
  • fallback 顺序推进
  • 多目标状态相互隔离

6. 状态机要求

每个目标必须维护独立状态。最少应包含以下运行态信息:

  • 当前激活层级(主目标或某一级 fallback)
  • 当前进程状态
  • 最近一次启动时间
  • 是否已达到稳定运行门槛
  • 检测窗口内 crash 记录
  • 当前是否处于 fallback 模式

watchdog 主循环根据检测结果和状态决定下一步动作:

  1. 检测通过:保持当前状态。
  2. 检测失败且当前无进程:尝试启动当前激活目标。
  3. 启动后未满 5 秒退出:记为启动失败。
  4. 启动后满 5 秒退出:记为一次 crash。
  5. crash 在窗口内达到阈值:切换到下一级 fallback。
  6. 已在最终 fallback:持续尝试最终 fallback,不再设计额外终止分支。

7. 架构原则

第一版本应坚持以下架构原则:

  • Linux 优先,接口设计与平台实现分离,为未来 Windows 预留空间。
  • 业务状态机与系统调用分离。
  • 检测器、启动器、fallback 决策解耦。
  • 多目标共享框架、独立状态。
  • 配置驱动目标定义,避免业务逻辑硬编码。
  • 第一版本优先简单可维护,不提前引入过度抽象。

8. 实施计划

阶段一:基础框架

完成项目骨架、CLI 入口、日志初始化、配置加载与最小多目标数据模型。

阶段二:核心运行闭环

实现目标轮询、exec 启动、基础检测器、稳定窗口判定、crash 记录。

阶段三:fallback 机制

实现固定顺序 fallback、目标切换、最终 fallback 持续尝试。

阶段四:测试与部署

补充关键单元测试,完善 x64 到 arm64 musl 交叉编译与部署脚本。

9. 成功标准

第一版本交付时,应满足以下标准:

  1. 能在 Linux arm64 目标机上稳定运行。
  2. 能同时监控多个目标程序。
  3. 能对未启动程序自动拉起。
  4. 能识别“启动失败”和“稳定运行后 crash”。
  5. 能在检测窗口内依据 crash 次数触发 fallback。
  6. 能按照固定顺序切换 fallback 目标。
  7. 能输出足够定位问题的日志。
  8. 核心状态机具备单元测试覆盖。

10. 结论

该项目第一版本定位为一个本地、轻量、配置驱动的多目标 watchdog。其核心价值在于以明确、稳定、低复杂度的方式实现进程守护、稳定性判定与临时 fallback 切换。设计上应优先保证 Linux 场景落地与 arm64 部署稳定性,同时通过合理模块边界为后续平台扩展、检测器扩展与日志扩展保留空间。