#!/bin/bash # ============================================= # 国内服务器:全流程自动化(独立运行,无需海外) # 1. M1 Pi 抓取(headful Playwright + HTTP 代理) # 2. 全链路 M2→M6(含日报) # ============================================= # 每天 06:00 / 12:00 / 18:00 / 22:00 各执行一次 # ============================================= # 用法: # ./scripts/domestic_full.sh # 全新执行 # ./scripts/domestic_full.sh --resume # 从中断处继续(跳过已完成步骤, # # 步骤状态见 data/run_state/{date}.state) # ============================================= set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_DIR="$(dirname "$SCRIPT_DIR")" cd "$PROJECT_DIR" # ── 参数解析 ── RESUME=0 for arg in "$@"; do case "$arg" in --resume) RESUME=1 ;; *) echo "未知参数: ${arg}(支持 --resume)" >&2; exit 1 ;; esac done 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 ── if [ -f .env ]; then set -a . ./.env set +a fi # ── 1. M1 Pi 抓取(headful Playwright + HTTP 代理)── # 部分源抓取失败不阻塞管道(原语义);抓取本身按 URL 去重(index.jsonl), # 已抓取过的 URL 不会重复写入;输出实时显示每源进度 # 只有 M1 脚本成功退出(即不是“全部源失败”)才标记完成; # 若全部源失败,不标记,--resume 可重新抓取。 M1_FAILED=0 if step_should_run M1_crawl; then LOG "━━━ [1/2] M1 抓取(headful Playwright + HTTP 代理)━━━" if bash "$SCRIPT_DIR/domestic_crawl_8g.sh" 2>&1 | tee -a "$FULL_LOG"; then step_mark M1_crawl else LOG "WARNING: M1 抓取未完全成功,本次不标记 M1_crawl,--resume 可重试" M1_FAILED=1 fi fi # ── 2. M2→M6 管道(含日报)── LOG "━━━ [2/2] M2→M6 管道 + 日报 ━━━" if [ "$RESUME" = "1" ]; then bash "$SCRIPT_DIR/pipeline.sh" --resume 2>&1 | tee -a "$FULL_LOG" else bash "$SCRIPT_DIR/pipeline.sh" 2>&1 | tee -a "$FULL_LOG" fi if [ "$M1_FAILED" -eq 1 ]; then LOG "⚠️ 全流程结束,但 M1 抓取未成功,退出码=1" exit 1 fi LOG "══════ 国内全流程完成 ✅ ══════"