gongxiangp2/scripts/run-history-import-daemon.sh
2026-05-07 16:37:22 +08:00

70 lines
1.9 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.

#!/usr/bin/env bash
set -u
INPUT_PATH="${1:-/root/gongxiangp2/output/history-sku-import-full.json}"
OPERATOR="${2:-admin}"
PAUSE_MS="${3:-1500}"
LOOP_PAUSE_SEC="${4:-5}"
WORKDIR="/root/gongxiangp2"
LOG_DIR="$WORKDIR/output"
LOG_PATH="$LOG_DIR/history-import-daemon.log"
CHECKPOINT_PATH="$LOG_DIR/$(basename "${INPUT_PATH%.*}").queue-progress.json"
mkdir -p "$LOG_DIR"
log() {
printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$1" | tee -a "$LOG_PATH"
}
pending_count() {
python3 - "$INPUT_PATH" "$CHECKPOINT_PATH" <<'PY'
import json, sys
input_path = sys.argv[1]
checkpoint_path = sys.argv[2]
with open(input_path, 'r', encoding='utf-8') as f:
records = json.load(f)
candidates = [r for r in records if r.get('status') == 'ready']
processed = set()
try:
with open(checkpoint_path, 'r', encoding='utf-8') as f:
checkpoint = json.load(f)
processed = {item.get('fingerprint', '') for item in checkpoint.get('results', []) if item.get('fingerprint')}
except FileNotFoundError:
pass
pending = [r for r in candidates if r.get('fingerprint') not in processed]
print(len(pending))
PY
}
log "历史导入守护进程启动"
log "input=$INPUT_PATH operator=$OPERATOR pause_ms=$PAUSE_MS loop_pause_sec=$LOOP_PAUSE_SEC checkpoint=$CHECKPOINT_PATH"
while true; do
PENDING="$(pending_count)"
if [ "$PENDING" = "0" ]; then
log "没有待处理记录,${LOOP_PAUSE_SEC}s 后继续巡检"
sleep "$LOOP_PAUSE_SEC"
continue
fi
log "剩余待处理: $PENDING,开始处理下一条"
(
cd "$WORKDIR" && \
npx tsx scripts/run-history-import-queue.ts \
--input="$INPUT_PATH" \
--operator="$OPERATOR" \
--apply \
--max-items=1 \
--pause-ms="$PAUSE_MS"
) >>"$LOG_PATH" 2>&1
EXIT_CODE=$?
if [ $EXIT_CODE -ne 0 ]; then
log "队列子进程异常退出,exit_code=$EXIT_CODE;${LOOP_PAUSE_SEC}s 后重试"
else
log "本轮处理完成,${LOOP_PAUSE_SEC}s 后继续"
fi
sleep "$LOOP_PAUSE_SEC"
done