Files
intl_news/scripts/_step_state.sh
T
simon 06b00b7f49 feat: 全流程脚本 --resume 断点续跑 + 各步骤文件级增量说明
- 新增 scripts/_step_state.sh:步骤状态库(data/run_state/{date}.state,按天换新)
- pipeline.sh / domestic_full.sh 支持 --resume,按步骤跳过已完成项
- step_run 显式检查退出码(规避 bash set -e 条件上下文陷阱),失败步骤不标记
- M1 保持部分源失败容忍(step_should_run/step_mark 手动控制)
- 确认并文档化各步骤文件级增量:M2/M4/M5 按文件存在跳过、M3 指纹库、M6 upsert 幂等
- 已同步 pi5 并验证(--badarg exit=1、step_run 机制正常)
2026-08-12 11:06:29 +08:00

61 lines
2.1 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# =============================================
# 步骤状态管理(--resume 中断恢复用)
# =============================================
# 用法(在脚本中 source):
# source "$SCRIPT_DIR/_step_state.sh"
# RESUME=0|1 # 由入口脚本参数解析后设置
# step_run <步骤名> <cmd...> # 执行并在成功后标记;resume 时已标记则跳过
# step_should_run <名> # 返回 0 = 需要运行(供需容忍部分失败的步骤手动控制)
# step_mark <名> # 手动标记完成
# =============================================
# 状态文件: data/run_state/{YYYYMMDD}.state(按本地日期换新,跨天自动失效)
# 说明: 各步骤内部的"跳过已处理文件"由各 Python 模块自带(见 pipeline.sh 头注释),
# 本文件仅做"步骤级"断点记录。
# =============================================
STEP_STATE_DIR="data/run_state"
step_state_file() {
echo "${STEP_STATE_DIR}/$(date +%Y%m%d).state"
}
step_done() {
# $1: 步骤名;已标记返回 0
[ -f "$(step_state_file)" ] && grep -qx "$1" "$(step_state_file)" >/dev/null 2>&1
}
step_mark() {
# $1: 步骤名;记录为已完成(幂等追加)
mkdir -p "${STEP_STATE_DIR}"
echo "$1" >> "$(step_state_file)"
}
step_should_run() {
# $1: 步骤名;resume 模式下已标记 → 返回 1(跳过),否则返回 0
if [ "${RESUME:-0}" = "1" ] && step_done "$1"; then
LOG "⏭️ 跳过已完成的步骤: $1(--resume)"
return 1
fi
return 0
}
step_run() {
# $1: 步骤名,$2...: 要执行的命令(成功后标记完成)
# 显式检查退出码:避免 bash set -e 在条件上下文(&&/||)调用函数时失效,
# 导致失败步骤被误标记为完成。
local name="$1"
shift
if ! step_should_run "$name"; then
return 0
fi
LOG "▶ $name"
"$@"
local rc=$?
if [ "$rc" -ne 0 ]; then
LOG "✗ $name 失败(exit=$rc),未标记完成;可 --resume 重试该步骤"
return "$rc"
fi
step_mark "$name"
}