Spaces:
Sleeping
Sleeping
File size: 4,140 Bytes
58e6885 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | #!/usr/bin/env bash
# 10-hour rolling loop: re-scan both data pools repeatedly so select_template
# naturally rotates through under-used chart_name variations (variation.json
# weights each pick by usage frequency, so the same input may end up rendered
# with different variations across rounds).
#
# Stop policy (graceful): before each round, check elapsed wall clock; if >=
# DEADLINE_SEC, do NOT start a new round. The currently running round is
# always allowed to finish.
#
# Output: APPENDS into output/line_pie_donut_chart_only/<pool>/ (same dir as
# the foundational run). Filenames carry an int timestamp so they never
# collide.
#
# Logs:
# logs/10h_run_round_<N>_<pool>.log per-round per-pool pipeline output
# logs/10h_run_summary.log this wrapper's own progress
set -u
set -o pipefail
cd "$(dirname "$0")/.."
ROOT="$(pwd)"
SUMMARY=logs/10h_run_summary.log
mkdir -p logs output/line_pie_donut_chart_only
log() { printf '[%s] %s\n' "$(date -Iseconds)" "$*" | tee -a "$SUMMARY"; }
log "==== 10h loop launcher ===="
log "cwd=$ROOT"
# -------- 1. wait for current line_pie_donut session to finish --------
PRIOR_SESSION="${PRIOR_SESSION:-line_pie_donut}"
if tmux has-session -t "$PRIOR_SESSION" 2>/dev/null; then
log "waiting for prior tmux session '$PRIOR_SESSION' to finish..."
while tmux has-session -t "$PRIOR_SESSION" 2>/dev/null; do
sleep 60
done
log "prior session '$PRIOR_SESSION' is gone, continuing"
else
log "prior session '$PRIOR_SESSION' not running, starting immediately"
fi
# -------- 2. config --------
if [[ ! -s allowed_chart_types.json ]]; then
log "ERROR: allowed_chart_types.json missing or empty; aborting"
exit 1
fi
log "whitelist (will be re-read by every worker via mtime cache):"
cat allowed_chart_types.json | tee -a "$SUMMARY"
export PUPPETEER_EXECUTABLE_PATH="${PUPPETEER_EXECUTABLE_PATH:-/usr/bin/google-chrome}"
THREADS="${THREADS:-48}"
# wall-clock budget; default 10h = 36000s
DEADLINE_SEC="${DEADLINE_SEC:-36000}"
log "PUPPETEER_EXECUTABLE_PATH=$PUPPETEER_EXECUTABLE_PATH"
log "THREADS=$THREADS"
log "DEADLINE_SEC=$DEADLINE_SEC ($(awk -v s=$DEADLINE_SEC 'BEGIN{printf "%.1fh", s/3600}'))"
mapfile -t POOLS < <(python -c "import config; print('\n'.join(config.data_resource_dirs))")
if [[ ${#POOLS[@]} -eq 0 ]]; then
log "ERROR: config.data_resource_dirs is empty"
exit 1
fi
log "POOLS (from config.data_resource_dirs):"
for p in "${POOLS[@]}"; do log " $p"; done
# -------- 3. rolling rounds --------
START_TS=$(date +%s)
ROUND=0
while :; do
NOW=$(date +%s)
ELAPSED=$((NOW - START_TS))
REMAINING=$((DEADLINE_SEC - ELAPSED))
if (( REMAINING <= 0 )); then
log "deadline reached (elapsed=${ELAPSED}s >= ${DEADLINE_SEC}s); not starting new round"
break
fi
ROUND=$((ROUND + 1))
log "============================================================"
log "ROUND $ROUND elapsed=$((ELAPSED/3600))h$(((ELAPSED%3600)/60))m remaining=$((REMAINING/3600))h$(((REMAINING%3600)/60))m"
log "disk before round: $(df -h /data | tail -1)"
for pool in "${POOLS[@]}"; do
name="$(basename "$pool")"
out="output/line_pie_donut_chart_only/$name"
log="logs/10h_run_round_${ROUND}_${name}.log"
mkdir -p "$out"
# NOTE: bash 'log' function got shadowed by the loop var 'log' (file path),
# so use printf directly for this round-line.
printf '[%s] -- round %d pool=%s out=%s\n' "$(date -Iseconds)" "$ROUND" "$pool" "$out" | tee -a "$SUMMARY"
python pipeline.py \
--input "$pool" \
--output "$out" \
--modules infographics_generator \
--chart-only --output-png \
--threads "$THREADS" \
2>&1 | tee "$log" > /dev/null
printf '[%s] -- round %d pool=%s DONE\n' "$(date -Iseconds)" "$ROUND" "$pool" | tee -a "$SUMMARY"
done
printf '[%s] round %d finished. disk after: %s\n' "$(date -Iseconds)" "$ROUND" "$(df -h /data | tail -1)" | tee -a "$SUMMARY"
done
END_TS=$(date +%s)
TOTAL=$((END_TS - START_TS))
printf '[%s] ==== 10h loop done after %dh %dm, completed %d full round(s) ====\n' \
"$(date -Iseconds)" $((TOTAL/3600)) $(((TOTAL%3600)/60)) "$ROUND" | tee -a "$SUMMARY"
|