准备工作
必须设置了rclone的服务,如果没有,按照前面的教程设置。
必须为rclone挂载了网盘,我在这里挂载了谷歌网盘。
创建第一个备份脚本文件
/root/root_multi_backup.sh
#!/bin/bash
# 设置变量 - 请修改以下路径
CONFIG_FILE="/root/backup_directories.txt" # 配置文件位于root用户目录
REMOTE_NAME="googledrive" # root用户配置的rclone远程名称
BACKUP_DIR="backup" # Google Drive上的备份目录名称
DATE=$(date +"%Y-%m-%d_%H-%M-%S") # 当前日期和时间
BACKUP_NAME="backup_${DATE}" # 备份总文件夹名称
LOG_DIR="/root/backup_logs" # 日志文件目录
LOG_FILE="${LOG_DIR}/backup_${DATE}.log" # 当前备份的日志文件
# 确保日志目录存在
mkdir -p "$LOG_DIR"
# 创建日志标题
echo "=====================================================" | tee -a "$LOG_FILE"
echo "备份开始: $(date)" | tee -a "$LOG_FILE"
echo "备份由root用户执行" | tee -a "$LOG_FILE"
echo "=====================================================" | tee -a "$LOG_FILE"
# 检查是否以root身份运行
if [ "$(id -u)" -ne 0 ]; then
echo "错误:此脚本必须以root身份运行!" | tee -a "$LOG_FILE"
exit 1
fi
# 检查配置文件是否存在
if [ ! -f "$CONFIG_FILE" ]; then
echo "错误:配置文件 $CONFIG_FILE 不存在!" | tee -a "$LOG_FILE"
exit 1
fi
# 创建备份根目录
echo "创建备份目录: ${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}" | tee -a "$LOG_FILE"
rclone mkdir "${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}" 2>&1 | tee -a "$LOG_FILE"
# 读取目录列表并备份每个目录
while IFS= read -r SOURCE_DIR || [[ -n "$SOURCE_DIR" ]]; do
# 跳过空行和注释
[[ -z "$SOURCE_DIR" || "$SOURCE_DIR" =~ ^# ]] && continue
# 移除可能的空格
SOURCE_DIR=$(echo "$SOURCE_DIR" | xargs)
# 提取目录名作为备份子目录名
DIR_NAME=$(basename "$SOURCE_DIR")
echo "" | tee -a "$LOG_FILE"
echo "=====================================================" | tee -a "$LOG_FILE"
echo "正在备份目录: $SOURCE_DIR" | tee -a "$LOG_FILE"
echo "开始时间: $(date)" | tee -a "$LOG_FILE"
echo "=====================================================" | tee -a "$LOG_FILE"
# 检查目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
echo "警告:目录 $SOURCE_DIR 不存在,跳过" | tee -a "$LOG_FILE"
continue
fi
# 计算目录大小和文件数量
echo "计算目录大小和文件数量..." | tee -a "$LOG_FILE"
DIR_SIZE=$(du -sh "$SOURCE_DIR" 2>/dev/null | cut -f1)
FILE_COUNT=$(find "$SOURCE_DIR" -type f | wc -l)
echo "目录大小: $DIR_SIZE, 文件数量: $FILE_COUNT" | tee -a "$LOG_FILE"
# 使用rclone将目录复制到目标位置,显示详细进度
echo "开始复制文件..." | tee -a "$LOG_FILE"
rclone copy "$SOURCE_DIR" "${REMOTE_NAME}:${BACKUP_DIR}/${BACKUP_NAME}/${DIR_NAME}" \
--progress \
--stats-one-line-date \
--stats=5s \
-v 2>&1 | tee -a "$LOG_FILE"
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "✓ 成功备份: $SOURCE_DIR" | tee -a "$LOG_FILE"
echo "完成时间: $(date)" | tee -a "$LOG_FILE"
else
echo "✗ 备份失败: $SOURCE_DIR" | tee -a "$LOG_FILE"
fi
done < "$CONFIG_FILE"
# 管理旧备份
echo "" | tee -a "$LOG_FILE"
echo "=====================================================" | tee -a "$LOG_FILE"
echo "检查旧备份..." | tee -a "$LOG_FILE"
BACKUPS=$(rclone lsf "${REMOTE_NAME}:${BACKUP_DIR}" | sort)
# 计算备份数量
BACKUP_COUNT=$(echo "$BACKUPS" | wc -l)
echo "发现 $BACKUP_COUNT 个备份" | tee -a "$LOG_FILE"
# 如果超过3个备份,删除最旧的备份
if [ "$BACKUP_COUNT" -gt 3 ]; then
# 计算需要删除多少个备份
DELETE_COUNT=$((BACKUP_COUNT - 3))
# 获取要删除的备份列表
TO_DELETE=$(echo "$BACKUPS" | head -n $DELETE_COUNT)
# 删除旧备份
echo "删除 $DELETE_COUNT 个旧备份..." | tee -a "$LOG_FILE"
echo "$TO_DELETE" | while read -r backup; do
echo "删除: ${backup}" | tee -a "$LOG_FILE"
rclone purge "${REMOTE_NAME}:${BACKUP_DIR}/${backup}" -v 2>&1 | tee -a "$LOG_FILE"
done
else
echo "备份数量为 $BACKUP_COUNT,不需要删除旧备份。" | tee -a "$LOG_FILE"
fi
# 管理旧的日志文件,只保留最近3个
echo "" | tee -a "$LOG_FILE"
echo "管理旧的日志文件..." | tee -a "$LOG_FILE"
LOG_FILES=$(ls -t ${LOG_DIR}/backup_*.log 2>/dev/null)
LOG_COUNT=$(echo "$LOG_FILES" | wc -l)
if [ "$LOG_COUNT" -gt 3 ]; then
DELETE_LOG_COUNT=$((LOG_COUNT - 3))
OLD_LOGS=$(echo "$LOG_FILES" | tail -n $DELETE_LOG_COUNT)
echo "删除 $DELETE_LOG_COUNT 个旧日志文件..." | tee -a "$LOG_FILE"
for old_log in $OLD_LOGS; do
echo "删除日志: $(basename $old_log)" | tee -a "$LOG_FILE"
rm -f "$old_log"
done
else
echo "日志文件数量为 $LOG_COUNT,不需要删除旧日志。" | tee -a "$LOG_FILE"
fi
echo "=====================================================" | tee -a "$LOG_FILE"
echo "备份完成: $(date)" | tee -a "$LOG_FILE"
echo "日志保存在: $LOG_FILE" | tee -a "$LOG_FILE"
echo "=====================================================" | tee -a "$LOG_FILE"
创建第二个备份目录文件
填入你要备份的目录
/root/backup_directories.txt
内容如下
/var/discourse
/opt
添加权限、执行脚本
sudo chmod +x /root/root_multi_backup.sh
sudo /root/root_multi_backup.sh
看一下脚本执行情况如何,如果正常,中止即可。
在1panel 面板添加计划任务——shell脚本——每天执行一次
1panel 执行计划任务的内容:
sudo /root/root_multi_backup.sh