1. 核心目标
通过进程级“检测 → 动作”流程,和定的边缘触发逻辑,实现:
- 监控某些目标进程(比如游戏平台)
- 在进程启动(首次出现)时,执行指定的动作(关闭 / 启动其它程序)
- 动作只执行一次,不会重复触发,不会连续弹窗
- 支持静默后台运行,无需用户一直守着
2. 整体架构
2.1 架构图
2.2 架构设计解读
入口层
main.rs只负责“拼接流程”,不含任何核心逻辑- 根据 CLI 参数决定运行模式
核心库层
-
每个模块职责单一(方便测试、复用,以及更新改动);避免单个文件迅速膨胀,变得不可维护:
cli.rs—— 参数建模config.rs—— 配置解析 + 结构体logger.rs—— 日志统一抽象process.rs—— 进程系统能力
3. 核心流程
3.1 主流程图
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。
★
”
本文使用 markdown.com.cn 排版