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
| #!/bin/bash
VPS_NAME="VPS-A" VPS_IP="192.168.1.5" VPS_PORT="22" KEY_PATH="/home/user/.ssh/192.168.1.5.pem"
SOURCE_DIR="/app"
BASE_BACKUP_DIR="/vol2/1000/backup/192.168.1.5"
KEEP_COUNT=7
if [ ! -d "$BASE_BACKUP_DIR" ]; then mkdir -p "$BASE_BACKUP_DIR" fi
cd "$BASE_BACKUP_DIR" || exit 1
LAST_BACKUP=$(ls -d */ 2>/dev/null | sort -r | head -n 1 | sed 's/\///') TODAY_STR=$(date +%Y%m%d) TARGET_DIR="${BASE_BACKUP_DIR}/${TODAY_STR}"
echo "[$VPS_NAME] 启动备份..." echo "今天目标: $TARGET_DIR"
RSYNC_OPTS="-avz --delete"
if [ -n "$LAST_BACKUP" ] && [ "$LAST_BACKUP" != "$TODAY_STR" ]; then echo "发现旧备份: [${LAST_BACKUP}],启用增量硬链接模式。" RSYNC_OPTS="${RSYNC_OPTS} --link-dest=${BASE_BACKUP_DIR}/${LAST_BACKUP}" else echo "执行全量备份。" fi
mkdir -p "$TARGET_DIR"
rsync $RSYNC_OPTS -e "ssh -p $VPS_PORT -i $KEY_PATH" root@${VPS_IP}:${SOURCE_DIR}/ ${TARGET_DIR}/
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then echo "-------------------------------------" echo "[$VPS_NAME] ✅ 备份成功!" echo "正在检查清理..." ls -d */ | sort -r | tail -n +$((KEEP_COUNT + 1)) | xargs -I {} rm -rf {} echo "完成。" exit 0 else echo "-------------------------------------" echo "[$VPS_NAME] ❌ 备份失败!(错误码: $EXIT_CODE)" echo "请检查 SSH 连接、磁盘空间或 rsync 是否安装。" rm -rf "$TARGET_DIR" exit 1 fi
|