#!/bin/bash # 日志文件定义 LOG_FILE="/root/data/shell_script/backup/backup.log" # 重定向标准输出和错误输出到日志文件 exec >>"${LOG_FILE}" 2>&1 # 打印时间戳以标记任务开始 echo "==================== $(date +"%Y-%m-%d %H:%M:%S") ====================" # 定义备份函数 backup_directory() { local SOURCE_DIR=$1 local BACKUP_DIR=$2 local PROJECT_NAME=$3 local DATE=$(date -d "-1 day" +"%Y-%m-%d") local ZIP_FILE="/tmp/${DATE}_${PROJECT_NAME}.zip" local MARK_FILE="/root/data/shell_script/backup/marks/${PROJECT_NAME}_${DATE}.mark"
# 检查是否存在此项目的标记文件 if [ ! -f "${MARK_FILE}" ]; then echo "No changes detected for ${PROJECT_NAME} today, skipping backup." return 0 fi
echo "Starting backup for ${PROJECT_NAME}..."
# 检查源目录是否存在 if [ ! -d "${SOURCE_DIR}" ]; then echo "Error: Source directory ${SOURCE_DIR} does not exist. Skipping." return 1 fi
# 检查备份目录是否可写 if [ ! -d "${BACKUP_DIR}" ] || [ ! -w "${BACKUP_DIR}" ]; then echo "Error: Backup directory ${BACKUP_DIR} is not writable or does not exist. Skipping." return 1 fi
# 检查是否存在同名文件并处理 if [ -f "${BACKUP_DIR}/$(basename ${ZIP_FILE})" ]; then echo "Warning: A backup file with the same name already exists in ${BACKUP_DIR}. Renaming the new backup." ZIP_FILE="/tmp/${DATE}_${PROJECT_NAME}_$(date +"%H%M%S").zip" echo "New backup file name: ${ZIP_FILE}" fi
# 压缩文件 echo "Compressing ${SOURCE_DIR} to ${ZIP_FILE}..." zip -r "${ZIP_FILE}" "${SOURCE_DIR}" > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "Error: Compression failed for ${PROJECT_NAME}. Skipping." return 1 fi echo "Compression completed: ${ZIP_FILE}"
# 移动到目标备份目录 echo "Moving ${ZIP_FILE} to ${BACKUP_DIR}..." mv "${ZIP_FILE}" "${BACKUP_DIR}" if [ $? -ne 0 ]; then echo "Error: Failed to move file to ${BACKUP_DIR}. Skipping." return 1 fi echo "File moved successfully."
# 维护备份文件数量(最多保留3份) echo "Maintaining backup files in ${BACKUP_DIR}..." cd "${BACKUP_DIR}" || return 1 BACKUP_COUNT=$(ls -1 *_${PROJECT_NAME}.zip 2>/dev/null | wc -l)
if [ "${BACKUP_COUNT}" -gt 3 ]; then echo "Deleting old backup files..." ls -1t *_${PROJECT_NAME}.zip | tail -n +4 | xargs rm -f if [ $? -eq 0 ]; then echo "Old backups deleted successfully." else echo "Error: Failed to delete old backups." fi else echo "No old backups to delete. Current count: ${BACKUP_COUNT}" fi
# 备份完成后删除标记文件 rm -f "${MARK_FILE}" echo "Removed mark file for ${PROJECT_NAME}"