File size: 2,133 Bytes
d646dd7
 
 
 
 
 
 
 
 
95f5290
 
 
 
 
d646dd7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/bin/bash
# 归档同步:把本地会话增量推送到 NAS(/vol2/egodata/sessions),只推不删。
# 用法:
#   archive_sync.sh                 # 全量:data/sessions/ → NAS
#   archive_sync.sh <批次目录>       # 单批次:推到 <项目>/<批次>/(处理完成钩子调用)
# 传输安全:rsync 逐块校验 + --partial 断点续传;推完 -rcn 二次校验;
# 失败自动重试一次;结果写 data/logs/archive.log。并发互斥(flock)。
set -u

NAS_USER="Stouch"
NAS_HOST="192.168.110.41"
NAS_ROOT="/vol2/egodata/sessions"
SRC_ROOT="/home/stouching/Desktop/Date-V/processor/data/sessions"
LOG_DIR="/home/stouching/Desktop/Date-V/processor/data/logs"
LOG_FILE="$LOG_DIR/archive.log"
SSH_OPTS="-o BatchMode=yes -o ConnectTimeout=10 -o ServerAliveInterval=15"

mkdir -p "$LOG_DIR"

log() { echo "[$(date '+%F %T')] $*" >> "$LOG_FILE"; }

do_sync() {  # $1=src(尾斜杠) $2=dst
  rsync -rltD --partial --info=stats2 --no-owner --no-group \
      -e "ssh $SSH_OPTS" "$1" "$2" >> "$LOG_FILE" 2>&1
}

verify_sync() {  # 输出非空 = 有差异(-rcn 逐文件 checksum dry-run)
  rsync -rcn --no-owner --no-group -e "ssh $SSH_OPTS" "$1" "$2" 2>&1 \
      | grep -v "setlocale" | grep -v '^$'
}

push_once() {
  local src="$1" dst="$2" t0 out
  t0=$(date +%s)
  if do_sync "$src" "$dst"; then
    out=$(verify_sync "$src" "$dst")
    if [ -z "$out" ]; then
      log "OK   $dst ($(( $(date +%s) - t0 ))s)"
      return 0
    fi
    log "校验不一致,重试: $dst"
  fi
  sleep 10
  if do_sync "$src" "$dst"; then
    out=$(verify_sync "$src" "$dst")
    if [ -z "$out" ]; then
      log "OK(重试) $dst ($(( $(date +%s) - t0 ))s)"
      return 0
    fi
  fi
  log "FAIL $dst"
  return 1
}

# 并发互斥:处理完成钩子与每晚 cron 可能同时触发
exec 9>"$LOG_DIR/archive.lock"
flock -n 9 || { log "SKIP 上一归档未结束"; exit 0; }

if [ $# -ge 1 ] && [ -n "$1" ]; then
  batch=$(realpath "$1")
  project=$(basename "$(dirname "$batch")")
  name=$(basename "$batch")
  push_once "$batch/" "$NAS_USER@$NAS_HOST:$NAS_ROOT/$project/$name/"
else
  push_once "$SRC_ROOT/" "$NAS_USER@$NAS_HOST:$NAS_ROOT/"
fi