Rust如何实现Windows下进程监控

0 阅读2分钟

1. 核心目标

通过进程级“检测 → 动作”流程,和定的边缘触发逻辑,实现:

  • 监控某些目标进程(比如游戏平台)
  • 在进程启动(首次出现)时,执行指定的动作(关闭 / 启动其它程序)
  • 动作只执行一次,不会重复触发,不会连续弹窗
  • 支持静默后台运行,无需用户一直守着

2. 整体架构

2.1 架构图

rust-proc-monitor-arch.png

2.2 架构设计解读

入口层

  • main.rs 只负责“拼接流程”,不含任何核心逻辑
  • 根据 CLI 参数决定运行模式

核心库层

  • 每个模块职责单一(方便测试、复用,以及更新改动);避免单个文件迅速膨胀,变得不可维护:

    • cli.rs —— 参数建模
    • config.rs —— 配置解析 + 结构体
    • logger.rs —— 日志统一抽象
    • process.rs —— 进程系统能力

3. 核心流程

3.1 主流程图

rust-proc-monitor-flow.png

3.2 流程拆解

启动阶段

  • 严格校验 CLI 参数,不认识的参数直接 exit(1)
  • -b 参数下,直接 spawn 一个子进程,父进程退出

初始化阶段

  • 初始化 Logger(控制台或文件)
  • 加载配置出
  • 初始化 sysinfo::System 实例
  • 初始化 Vec<bool> 状态数组:用于主循环中快速匹配

核心循环

  • 刷新系统进程列表
  • 对每条监控规则,检查目标进程是否在运行
  • 只在状态变化时触发动作:边缘触发(Edge-triggered)

4. 核心实现拆解

4.1 配置建模

toml

[[monitor.process]]
monitored = "steam.exe"
action = { "clash-verge.exe" = "close", "ShadowsocksR.exe" = "close" }
check_interval = 10

关键设计思路:

  • 一条规则 = 一个被监控进程 + 一组动作
  • 动作用 HashMap 表达:避免重复动作,且方便快速查找
  • 每个规则独立配置检查间隔(如游戏进程可以较长,工具类较短)
  • 每条规则独立循环,互不干扰

4.2 入口与控制逻辑

  • CLI 参数使用“默认值 + 逐项改写”的模式
  • 未知参数直接 panic-style 退出

4.3 进程检测(核心)

rust

fn is_process_running(sys: &System, name: &str) -> bool {
    sys.processes_by_name(OsStr::new(name))
       .next()
       .is_some()
}
  • 不收集所有结果
  • 只取第一个匹配,立刻返回
  • 时间复杂度最优

同时,配合 sys.refresh_processes(ProcessesToUpdate::All, true) 获取最新进程列表。


4.4 动作执行机制

项目支持两种动作:

动作说明
Close调用 Windows taskkill /F /IM
Start调用 cmd /C start "" 启动进程

rust

fn execute_actions(
    sys: &System,
    actions: &HashMap<String, ActionType>,
    logger: &mut Logger,
)

错误隔离:一个动作失败,不会阻止其他动作执行,所有错误只记日志。


4.5 状态管理(精华)

状态采用边缘触发 + 去抖动逻辑:

  • 用一个 Vec<bool> 存储
  • 只在状态翻转时执行动作
  • 不会出现“每 10 秒杀一次进程”的灾难

5. 如何运行 / 验证

构建运行

powershell

# 构建
cargo build --release

# 前台模式
.\proc_monitor.exe

# 后台静默模式
.\proc_monitor.exe -b

# 文件日志模式
.\proc_monitor.exe -l

配置示例

toml

[[monitor.process]]
monitored = "steam.exe"
action = { "clash-verge.exe" = "close" }
check_interval = 10

只要 steam.exe 一出现,就会自动关闭 clash-verge.exe

项目地址:github.com/alwaysrun/p…

本文使用 markdown.com.cn 排版