进度跟踪是什么
进度跟踪要让执行过程可观测、可中断、可续跑。基本要素是总数、已完成数(必须区分成功与失败)、在途数,再细到每个目标的状态取值与时间戳。实现的关键是把状态持久化到文件或数据库,而不是只留在内存中,这样进程中断或主机重启后还能续跑;同时注意输出的缓冲问题——日志看起来停在某一步,任务实际可能仍在运行,此时应以状态记录为准判断进度。
基本信息
| 核心指标 | 总数、成功数、失败数、跳过数、在途数、剩余时间预估 |
|---|---|
| 细粒度状态 | pending、running、ok、failed、skipped、canceled |
| 持久化方式 | 状态文件或数据库,支持断点续跑 |
| 观测通道 | 进度文件、结构化事件流、暴露为监控指标 |
典型使用场景
- 大批量执行需要判断是在推进还是已经卡住
- 中断后需要知道从哪些目标继续执行
- 需要向干系人提供可核对、可复现的进度
- 依据历史耗时数据预估剩余时间与窗口占用
- 需要区分失败与尚未执行,避免续跑时重复操作
状态记录与续跑
状态记录与续跑
# 进度持久化:先写 running,再写终态,中断后状态不丢
printf '%s\t%s\n' "$h" running >> progress.tsv
if ssh -n "$h" 'true'; then
printf '%s\t%s\n' "$h" ok >> progress.tsv
else
printf '%s\t%s\n' "$h" failed >> progress.tsv
fi
# 续跑:只挑未成功的目标
awk -F'\t' '$2=="ok"{print $1}' progress.tsv | sort -u > done.txt
comm -23 <(sort hosts) done.txt > todo.txt
printf 'done=%s todo=%s\n' "$(wc -l < done.txt)" "$(wc -l < todo.txt)"进度指标与异常判读
| 指标 | 含义 | 异常表现 |
|---|---|---|
| 总数 | 本次作业的目标数量 | 与预检数量不一致说明目标选择有问题 |
| 成功数 | 已确认完成的数量 | 长时间不增长说明已经在卡住 |
| 失败数 | 明确失败的数量 | 快速上升需要立即中止并止损 |
| 在途数 | 正在执行的数量 | 长期保持高位说明任务没有正常退出 |
| 跳过数 | 因条件不满足未执行 | 大量跳过说明判定条件过严 |
输出的缓冲会让日志看起来停在某一步,但任务实际仍在执行。进度判断应以状态记录为准,同时尽量使用行缓冲或非缓冲输出,减少误判带来的不必要干预。
只在内存中维护进度,进程中断或主机重启后进度全部丢失,只能从头重跑;对带副作用的操作,这意味着已变更的目标会被重复操作,影响可能比原故障更大。