diff --git a/update.sh b/update.sh index a55ffc5..cc03997 100755 --- a/update.sh +++ b/update.sh @@ -13,18 +13,37 @@ KIBANA_ES='http://kibana-sg3.ushareit.org/elasticsearch' DATA_FILE='data.json' KEEP_DAYS=14 -# ============ 11 点档判断(UTC+8)============ -# 服务器每小时触发;只有当 UTC+8 当前小时 == 11 时才真正执行。 +# ============ 执行时机判断(UTC+8,健壮版)============ +# 平台每小时触发一次本脚本。策略: +# 当 UTC+8 已过 11 点(含11点) 且 data.json 里还没有"今天(UTC+8)"这一行时 -> 执行补跑; +# 否则跳过。这样不依赖平台精确在 11:05 触发,只要 11 点后某次触发到了就会补当天,且一天只跑一次。 +# 设 FORCE_RUN=1 可无条件强制运行。 HOUR_CST=$(TZ='Asia/Shanghai' date +%H) +RUN_DATE=$(TZ='Asia/Shanghai' date '+%Y/%-m/%-d') # 总表"日期"= 运行当天,格式 2026/9/3 FORCE="${FORCE_RUN:-0}" -if [ "$HOUR_CST" != "11" ] && [ "$FORCE" != "1" ]; then - echo "[skip] 当前 UTC+8 $HOUR_CST 点,非 11 点档,跳过。(设 FORCE_RUN=1 可强制运行)" - exit 0 +if [ "$FORCE" != "1" ]; then + # 1) 必须已过 11 点 + if [ "$((10#$HOUR_CST))" -lt 11 ]; then + echo "[skip] 当前 UTC+8 $HOUR_CST 点,未到 11 点,跳过。" + exit 0 + fi + # 2) 今天是否已更新过(data.json 是否已有 RUN_DATE 这一行) + if [ -f "$DATA_FILE" ]; then + ALREADY=$(python3 -c "import json,sys +try: + d=json.load(open('$DATA_FILE',encoding='utf-8')) + print('1' if any(r.get('date')=='$RUN_DATE' for r in d.get('summary',[])) else '0') +except Exception: + print('0')") + if [ "$ALREADY" = "1" ]; then + echo "[skip] 今天($RUN_DATE)已更新过,跳过。" + exit 0 + fi + fi fi # ============ 日期计算(UTC+8 前一天)============ # 前一天 UTC+8 的 00:00~24:00,换算成 ES 用的 UTC 时间窗口。 -RUN_DATE=$(TZ='Asia/Shanghai' date '+%Y/%-m/%-d') # 总表"日期"= 运行当天,格式 2026/9/3 PREV_DATE_CST=$(TZ='Asia/Shanghai' date -v-1d '+%Y/%-m/%-d' 2>/dev/null || TZ='Asia/Shanghai' date -d 'yesterday' '+%Y/%-m/%-d') # 明细表 dt = 前一天(UTC+8) # ES 时间窗口(UTC): 前一天 00:00 CST = 前一天 -08:00 UTC;到 当天 00:00 CST