#!/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 ── export $(grep -v '^#' .env | grep -v '^$' | xargs 2>/dev/null || true) # ── 1. M1 Pi 抓取(headful Playwright + HTTP 代理)── # 部分源抓取失败不阻塞管道(原语义);抓取本身按 URL 去重(index.jsonl), # 已抓取过的 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 | 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 | tee -a "$FULL_LOG" else bash "$SCRIPT_DIR/pipeline.sh" 2>&1 | tee -a "$FULL_LOG" fi LOG "══════ 国内全流程完成 ✅ ══════"