寫一個自動備份腳本 文章首圖

寫一個自動備份腳本

寫一個自動備份腳本

在日常的 Linux 系統管理工作中,資料安全始終是首要考量。無論是你珍貴的個人文件、網站程式碼,還是資料庫內容,一旦發生硬體故障、人為誤刪或惡意軟體攻擊,備份(Backup)往往是唯一的救命稻草。雖然市面上有許多強大的備份工具如 rsyncborgrestic,但對於初學者或需要快速處理簡單需求的情境來說,撰寫一個簡潔、可讀性高的 Shell 腳本,不僅能讓你完全掌控備份邏輯,還能作為學習 Bash 程式設計的絕佳練習。

本文将介绍如何编写一个功能完整、具备压缩、命名规范和基础错误处理的自动备份脚本,适用于 Ubuntu 22.04 或 Debian 12 系统。

脚本设计思路

一个实用的备份脚本通常包含以下几个核心要素:

  1. 源目录与目标目录:明确要备份哪里,以及备份到哪里。
  2. 日期戳:为每个备份文件生成唯一的文件名,避免覆盖旧数据。
  3. 压缩:使用 tar 将文件打包并压缩(如 .tar.gz),以节省存储空间。
  4. 错误处理:检查源目录是否存在,压缩是否成功等。
  5. 日志记录:记录备份开始和结束的时间,方便后续审计。

完整可执行脚本

以下是一个名为 auto_backup.sh 的脚本示例。你可以将其保存到你的主目录或 /usr/local/bin/ 下,并赋予执行权限。

#!/bin/bash

# ==========================================
# 自动备份脚本 (auto_backup.sh)
# 适用环境: Ubuntu 22.04 / Debian 12
# 功能: 备份指定目录并生成带时间戳的压缩包
# ==========================================

# --- 配置区 ---
SOURCE_DIR="/home/username/Documents"  # 源目录,请根据实际情况修改
BACKUP_DIR="/home/username/backups"    # 备份目标目录
LOG_FILE="/home/username/backup.log"   # 日志文件路径

# --- 变量初始化 ---
DATE=$(date +"%Y%m%d_%H%M%S")         # 生成日期戳,格式:YYYYMMDD_HHMMSS
BACKUP_FILE="${BACKUP_DIR}/backup_${DATE}.tar.gz"

# --- 函数定义 ---

# 记录日志函数
log_message() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# --- 主程序 ---

log_message "开始执行备份任务..."

# 1. 检查源目录是否存在
if [ ! -d "$SOURCE_DIR" ]; then
    log_message "错误:源目录 $SOURCE_DIR 不存在!"
    exit 1
fi

# 2. 确保备份目录存在
if [ ! -d "$BACKUP_DIR" ]; then
    log_message "备份目录不存在,正在创建..."
    mkdir -p "$BACKUP_DIR"
fi

# 3. 执行备份并压缩
# 使用 tar 命令,-c 创建,-z 压缩,-v 显示过程,-f 指定文件名
# --warning=no-file-changed 避免在备份过程中文件变动导致的警告
log_message "正在备份 $SOURCE_DIR 到 $BACKUP_FILE ..."
tar -czf "$BACKUP_FILE" \
    --warning=no-file-changed \
    -C "$(dirname "$SOURCE_DIR")" \
    "$(basename "$SOURCE_DIR")"

# 4. 检查备份是否成功
if [ $? -eq 0 ]; then
    # 获取备份文件大小并格式化显示
    FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log_message "备份成功!文件大小: $FILE_SIZE"
else
    log_message "错误:备份过程中发生错误,请检查日志。"
    exit 1
fi

# 5. (可选) 删除超过 30 天的旧备份,节省空间
# find "$BACKUP_DIR" -name "backup_*.tar.gz" -mtime +30 -delete
# log_message "已清理超过 30 天的旧备份。"

log_message "备份任务完成。"

如何使用此脚本

  1. 保存脚本:将上述代码保存为 auto_backup.sh
  2. 修改配置:编辑脚本顶部的 SOURCE_DIRBACKUP_DIR,指向你实际需要的路径。
  3. 赋予执行权限
    chmod +x auto_backup.sh
  4. 手动测试
    ./auto_backup.sh

    检查生成的 backup_*.tar.gz 文件和 backup.log 日志。

常见问题与注意事项

1. 权限问题导致备份失败

如果在执行脚本时遇到 Permission denied 错误,通常是因为源目录或备份目录的权限设置不当。确保运行脚本的用户(通常是当前用户)对 SOURCE_DIR 有读取权限,对 BACKUP_DIR 有写入权限。如果是备份系统级目录(如 /etc),则需要使用 sudo 运行脚本。

2. 如何自动化执行?

手动运行脚本显然不符合“自动”的定义。我们可以利用 Linux 的 cron 服务来实现定时备份。编辑 crontab:

crontab -e

添加以下行,表示每天凌晨 2 点执行备份:

0 2 * * * /home/username/auto_backup.sh

注意:在 cron 中,环境变量可能与交互式 shell 不同,建议在脚本中使用绝对路径,或在脚本开头声明必要的 PATH

小結

透過撰寫這個簡單的 Shell 腳本,我們不僅實現了資料的自動壓縮備份,還學習了如何處理日期戳、目錄檢查、壓縮指令以及基礎的錯誤處理。對於進階使用者,可以進一步加入 GPG 加密以保護敏感資料,或結合 rsync 實現增量備份以提高效率。無論如何,建立一個可靠且可測試的備份策略,是每一位 Linux 使用者必備的基礎技能。現在,就從設定你的第一個備份任務開始吧!