feat: 全流程终端实时进度输出 + 步骤日志

- step_run 增加耗时统计(▶ 开始 / ✔ 完成 Ns / ✗ 失败 exit=N)与 STEP_LOG 支持
- domestic_full.sh / pipeline.sh 去掉 tail 截断,输出实时透传终端并 tee 到 logs/*.log
- 退出码用 PIPESTATUS[0] 捕获(规避 pipefail/tee 吞码);全角标点后变量用花括号包裹
- 已同步 pi5 实测:M3 31s / M6 20s 耗时显示正常,日志文件生成
This commit is contained in:
2026-08-12 11:18:08 +08:00
parent 06b00b7f49
commit bdd936a3e4
5 changed files with 63 additions and 8 deletions
+18 -4
View File
@@ -44,17 +44,31 @@ step_run() {
# $1: 步骤名,$2...: 要执行的命令(成功后标记完成)
# 显式检查退出码:避免 bash set -e 在条件上下文(&&/||)调用函数时失效,
# 导致失败步骤被误标记为完成。
# 设置环境变量 STEP_LOG=路径 时,步骤全部输出同时写入该日志(终端仍实时显示)。
local name="$1"
shift
if ! step_should_run "$name"; then
return 0
fi
LOG "▶ $name"
"$@"
local rc=$?
local t0 rc t1
t0=$(date +%s)
LOG "▶ $name 开始"
# 显式取原命令退出码(PIPESTATUS[0]):
# - 无 pipefail 时管道码=tee 码(0),必须用 PIPESTATUS 还原真实结果;
# - pipefail + 非条件上下文时失败会触发 set -e 直接退出(此时不 mark,正确);
# - 条件上下文调用时 set -e 被抑制,这里仍能正确捕获并 return。
if [ -n "${STEP_LOG:-}" ]; then
"$@" 2>&1 | tee -a "$STEP_LOG"
rc=${PIPESTATUS[0]}
else
"$@"
rc=$?
fi
t1=$(date +%s)
if [ "$rc" -ne 0 ]; then
LOG "✗ $name 失败(exit=$rc),未标记完成;可 --resume 重试该步骤"
LOG "✗ ${name} 失败(exit=${rc},耗时 $((t1 - t0))s);未标记完成,可 --resume 重试"
return "$rc"
fi
LOG "✔ $name 完成(耗时 $((t1 - t0))s)"
step_mark "$name"
}
+12 -4
View File
@@ -30,26 +30,34 @@ source "$SCRIPT_DIR/_step_state.sh"
LOG() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; }
# ── 全流程日志:所有输出实时显示到终端,同时完整写入日志文件 ──
LOG_DIR="logs"
mkdir -p "$LOG_DIR"
FULL_LOG="$LOG_DIR/domestic_full_$(date +%Y%m%d_%H%M%S).log"
: > "$FULL_LOG"
LOG "══════ 国内全流程开始(resume=${RESUME})═══════"
LOG "全流程日志: ${FULL_LOG}(终端实时显示完整进度)"
# ── 加载 .env ──
export $(grep -v '^#' .env | grep -v '^$' | xargs 2>/dev/null || true)
# ── 1. M1 Pi 抓取(headful Playwright + HTTP 代理)──
# 部分源抓取失败不阻塞管道(原语义);抓取本身按 URL 去重(index.jsonl),
# 已抓取过的 URL 不会重复写入
# 已抓取过的 URL 不会重复写入;输出实时显示每源进度
if step_should_run M1_crawl; then
LOG "[1/2] Pi M1 抓取(8G headful + HTTP 代理)..."
bash "$SCRIPT_DIR/domestic_crawl_8g.sh" 2>&1 | tail -5 || LOG "WARNING: 部分源抓取失败,继续管道"
bash "$SCRIPT_DIR/domestic_crawl_8g.sh" 2>&1 | tee -a "$FULL_LOG" \
|| LOG "WARNING: 部分源抓取失败,继续管道"
step_mark M1_crawl
fi
# ── 2. M2→M6 管道(含日报)──
LOG "[2/2] 全链路管道..."
if [ "$RESUME" = "1" ]; then
bash "$SCRIPT_DIR/pipeline.sh" --resume 2>&1 | tail -10
bash "$SCRIPT_DIR/pipeline.sh" --resume 2>&1 | tee -a "$FULL_LOG"
else
bash "$SCRIPT_DIR/pipeline.sh" 2>&1 | tail -10
bash "$SCRIPT_DIR/pipeline.sh" 2>&1 | tee -a "$FULL_LOG"
fi
LOG "══════ 国内全流程完成 ✅ ══════"
+6
View File
@@ -35,7 +35,13 @@ source "$SCRIPT_DIR/_step_state.sh"
LOG() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*"; }
# ── 步骤日志:全部输出实时显示到终端,同时完整写入日志文件 ──
LOG_DIR="logs"
mkdir -p "$LOG_DIR"
STEP_LOG="$LOG_DIR/pipeline_$(date +%Y%m%d_%H%M%S).log"
: > "$STEP_LOG"
LOG "══════ 全链路管道开始(resume=${RESUME})═══════"
LOG "步骤日志: ${STEP_LOG}(终端实时显示完整进度)"
# 加载 .env
export $(grep -v '^#' .env | grep -v '^$' | xargs 2>/dev/null || true)