57 lines
2.9 KiB
Bash
Executable File
57 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# run_monitor_nas.sh — NAS 监控 v2 runner(spec §20.15 NAS 侧; sanguo-vps-mirror 16:00 班尾挂接)
|
|
#
|
|
# 模式: 同 03:00 链家族(宿主 bash+scp 不进容器); 纯逻辑在 nas_monitor_check.py
|
|
# (宿主 /usr/bin/python3.8 stdlib). 产物 out/*.json → scp VPS inbox
|
|
# (C:/sanguo_vnpy_v2/data/monitor/inbox/), VPS data_monitor 班次摄取落 alerts.db.
|
|
# 幂等: events 文件按 HHMM 命名 + .pushed_<day>_<HHMM> marker 防重推;
|
|
# 零事件也写(带 generated_at, VPS 靠它做 NAS 静默检测).
|
|
# rc 隔离: 恒 exit 0, 不拖垮 vps-mirror 聚合 rc(失败只记 cron.log).
|
|
# 部署位: /volume1/stock/monitor_nas/(宿主文件, CI 不覆盖; 改 repo 副本后
|
|
# scp -O 手动同步——同 corpus/dmsk/vps-mirror runner 纪律).
|
|
set -u
|
|
# P3 长尾(硬编码 IP/私钥): env 可覆盖, 缺省=现网值(行为零变化)。
|
|
KEY=${SANGUO_MONITOR_SSH_KEY:-/var/services/homes/admin/.ssh/id_ed25519_nas}
|
|
VPS=${SANGUO_MONITOR_VPS:-Administrator@49.232.102.198}
|
|
VPS_INBOX=C:/sanguo_vnpy_v2/data/monitor/inbox
|
|
ROOT=/volume1/stock/monitor_nas
|
|
PY=/usr/bin/python3
|
|
# P3 长尾(StrictHostKeyChecking=no 全裸奔): accept-new=TOFU——首连即录
|
|
# $ROOT/known_hosts, 之后主机键变更即拒(MITM 可见); 零部署摩擦(首跑自动建档)。
|
|
SCP_OPTS=(-i "$KEY" -o StrictHostKeyChecking=accept-new
|
|
-o UserKnownHostsFile="$ROOT/known_hosts" -o ConnectTimeout=20)
|
|
|
|
mkdir -p "$ROOT/out"
|
|
{
|
|
echo "=== $(date '+%F %T') nas monitor start ==="
|
|
"$PY" "$ROOT/nas_monitor_check.py"
|
|
rc_nas=$?
|
|
# N-1(10-05): rc 先存后拼——旧版 $(date) 在同一 echo 词内先展开把 $? 重置
|
|
# 为 0, exit= 恒 0; rc 隔离下这是 NAS 体检崩溃在 cron.log 的唯一现场线索
|
|
echo "=== $(date '+%F %T') nas monitor exit=$rc_nas ==="
|
|
# 远端 inbox 目录幂等建好; ssh 必带 -n(vps-mirror 坑: 不带会吃 stdin)
|
|
ssh -n "${SCP_OPTS[@]}" "$VPS" \
|
|
"powershell -Command \"New-Item -ItemType Directory -Force -Path '$VPS_INBOX' | Out-Null\"" \
|
|
|| echo "[$(date '+%T')] WARN inbox mkdir fail"
|
|
for f in "$ROOT"/out/nas_events_*.json; do
|
|
[ -f "$f" ] || continue
|
|
base=$(basename "$f" .json) # nas_events_YYYYMMDD_HHMM
|
|
day=${base#nas_events_}; day=${day%%_*}
|
|
stamp=${base##*_}
|
|
[ -f "$ROOT/out/.pushed_${day}_${stamp}" ] && continue
|
|
if scp "${SCP_OPTS[@]}" "$f" "$VPS:$VPS_INBOX/${base}.json" >>"$ROOT/cron.log" 2>&1; then
|
|
touch "$ROOT/out/.pushed_${day}_${stamp}"
|
|
echo "=== $(date '+%T') push ok: $base ==="
|
|
else
|
|
echo "=== $(date '+%T') push FAIL: $base(下次班重试) ==="
|
|
fi
|
|
done
|
|
# out/ 保洁(P3 长尾: 产物无清理只增不减): health/events/pushed marker
|
|
# 只留 14 天(VPS migration_logs 侧已在 b954b02 保洁, 本处=NAS 半边)。
|
|
find "$ROOT/out" -maxdepth 1 -type f \( -name 'nas_health_*.json' \
|
|
-o -name 'nas_events_*.json' -o -name '.pushed_*' \) -mtime +14 -delete \
|
|
2>/dev/null || true
|
|
} >> "$ROOT/cron.log" 2>&1
|
|
|
|
exit 0
|