#!/bin/bash # 全自动串行 rsync 同步脚本 # 策略:单链路串行传输,避免并行抢带宽;按依赖优先级排序 # 已传数据自动续传(--partial) set -u LOGDIR="/home/xsl/change_hair/project/logs" DONE_MARKER="$LOGDIR/sync_all.done" mkdir -p "$LOGDIR" # 如果已全部完成,直接退出 [ -f "$DONE_MARKER" ] && { echo "所有同步任务已完成,跳过"; exit 0; } # 任务定义:名称|源|目标 # 优先级排序:换发色关键链路优先 → 换发型 → 训练相关 → 大数据最后 TASKS=( "photo_service|szlc@192.168.101.63:/home/szlc/project/photo_service/|/home/xsl/change_hair/project/photo_service/" "project_data|szlc@192.168.101.63:/home/szlc/project/data/|/home/xsl/change_hair/project/data/" "hair_service_sd|szlc@192.168.101.63:/home/szlc/project/hair_service_sd/|/home/xsl/change_hair/project/hair_service_sd/" "conda_py310|szlc@192.168.101.63:/home/szlc/miniconda3/envs/py310/|/home/xsl/miniconda3/envs/py310/" "conda_my_hair|szlc@192.168.101.63:/home/szlc/miniconda3/envs/my_hair/|/home/xsl/miniconda3/envs/my_hair/" "conda_sdwebui|szlc@192.168.101.63:/home/szlc/miniconda3/envs/sdwebui/|/home/xsl/miniconda3/envs/sdwebui/" "kohya_ss_home|szlc@192.168.101.63:/home/szlc/project/kohya_ss_home/|/home/xsl/change_hair/project/kohya_ss_home/" "onediff|szlc@192.168.101.63:/home/szlc/project/onediff/|/home/xsl/change_hair/project/onediff/" "train_material|szlc@192.168.101.63:/data/train_material/|/home/xsl/change_hair/data/train_material/" ) echo "========================================" | tee -a "$LOGDIR/sync_main.log" echo "串行同步开始: $(date '+%Y-%m-%d %H:%M:%S')" | tee -a "$LOGDIR/sync_main.log" echo "========================================" | tee -a "$LOGDIR/sync_main.log" FAIL=0 for task in "${TASKS[@]}"; do NAME="${task%%|*}"; rest="${task#*|}" SRC="${rest%%|*}"; DST="${rest#*|}" TLOG="$LOGDIR/sync_${NAME}.log" # 已完成的任务跳过(用标记文件判断) if [ -f "$LOGDIR/sync_${NAME}.ok" ]; then echo "[$(date '+%H:%M:%S')] [$NAME] 已完成,跳过" | tee -a "$LOGDIR/sync_main.log" continue fi echo "[$(date '+%H:%M:%S')] [$NAME] 开始: $SRC -> $DST" | tee -a "$LOGDIR/sync_main.log" mkdir -p "$DST" # rsync 串行传输,最多重试3次 RETRY=0 while [ $RETRY -lt 3 ]; do if rsync -a --partial --inplace --info=progress2,NAME0 \ -e "ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o ConnectTimeout=15" \ "$SRC" "$DST" >>"$TLOG" 2>&1; then touch "$LOGDIR/sync_${NAME}.ok" echo "[$(date '+%H:%M:%S')] [$NAME] 完成 ✓" | tee -a "$LOGDIR/sync_main.log" break else RETRY=$((RETRY+1)) echo "[$(date '+%H:%M:%S')] [$NAME] 第${RETRY}次失败,重试中..." | tee -a "$LOGDIR/sync_main.log" sleep 5 fi done if [ $RETRY -ge 3 ]; then echo "[$(date '+%H:%M:%S')] [$NAME] 失败 ✗ (重试3次)" | tee -a "$LOGDIR/sync_main.log" FAIL=$((FAIL+1)) fi done echo "========================================" | tee -a "$LOGDIR/sync_main.log" echo "同步全部结束: $(date '+%Y-%m-%d %H:%M:%S'), 失败任务数: $FAIL" | tee -a "$LOGDIR/sync_main.log" echo "========================================" | tee -a "$LOGDIR/sync_main.log" if [ $FAIL -eq 0 ]; then touch "$DONE_MARKER" echo "全部成功完成" | tee -a "$LOGDIR/sync_main.log" fi