寫一個自動備份腳本
在日常的 Linux 系統管理工作中,資料安全始終是首要考量。無論是你珍貴的個人文件、網站程式碼,還是資料庫內容,一旦發生硬體故障、人為誤刪或惡意軟體攻擊,備份(Backup)往往是唯一的救命稻草。雖然市面上有許多強大的備份工具如 rsync、borg 或 restic,但對於初學者或需要快速處理簡單需求的情境來說,撰寫一個簡潔、可讀性高的 Shell 腳本,不僅能讓你完全掌控備份邏輯,還能作為學習 Bash 程式設計的絕佳練習。
本文将介绍如何编写一个功能完整、具备压缩、命名规范和基础错误处理的自动备份脚本,适用于 Ubuntu 22.04 或 Debian 12 系统。
脚本设计思路
一个实用的备份脚本通常包含以下几个核心要素:
- 源目录与目标目录:明确要备份哪里,以及备份到哪里。
- 日期戳:为每个备份文件生成唯一的文件名,避免覆盖旧数据。
- 压缩:使用
tar将文件打包并压缩(如.tar.gz),以节省存储空间。 - 错误处理:检查源目录是否存在,压缩是否成功等。
- 日志记录:记录备份开始和结束的时间,方便后续审计。
完整可执行脚本
以下是一个名为 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 "备份任务完成。"
如何使用此脚本
- 保存脚本:将上述代码保存为
auto_backup.sh。 - 修改配置:编辑脚本顶部的
SOURCE_DIR和BACKUP_DIR,指向你实际需要的路径。 - 赋予执行权限:
chmod +x auto_backup.sh - 手动测试:
./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 使用者必備的基礎技能。現在,就從設定你的第一個備份任務開始吧!