Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux Web 目錄全量備份 Shell 腳本:定時、增量、保留天數、Crontab 實戰

編輯:Linux 系統常見問題解答

生產環境 Web 目錄備份需「全量打包、定時執行、自動清理舊備份」。本文提供一個健壯的 filebak.sh 腳本,支持參數化目標目錄、備份存放路徑、保留天數,並給出 Crontab 多種調度範例。

腳本功能特性

  • 參數校驗:目標目錄存在性、備份目錄自動創建、保留天數合法性。
  • 命名規範:目錄名_日期_時間戳.tar.gz,避免衝突。
  • 打包優化:cd 目標父目錄 && tar -zcf 目錄名,保證解包後路徑正確。
  • 自動清理:find -mtime +N -exec rm 刪除超期備份。
  • 錯誤處理:關鍵步驟非零退出碼即中止並報錯。

腳本完整代碼 filebak.sh

#!/bin/bash
# filebak.sh - Web 目錄全量備份腳本
# 用法: sh filebak.sh 目標目錄 備份存放路徑 保留天數
# 例: sh filebak.sh /home/wwwroot /backup/web 7

set -euo pipefail

# 參數解析
target_dir="${1:-}"
backup_root="${2:-}"
retain_days="${3:-}"

# 參數校驗
if [[ -z "$target_dir" || -z "$backup_root" || -z "$retain_days" ]]; then
    echo "Usage: $0   "
    exit 1
fi

if [[ ! -d "$target_dir" ]]; then
    echo "ERROR: Target directory '$target_dir' does not exist."
    exit 1
fi

# 備份根目錄不存在則創建
mkdir -p "$backup_root"

# 時間戳
timestamp=$(date +"%Y-%m-%d-%H-%M-%S")
day=$(date +"%d")
month=$(date +"%Y-%m")
weekday=$(date +"%u")

# 目標目錄純名稱(用於文件名前綴)
dir_name=$(basename "$target_dir")
archive_name="${dir_name}${day}${timestamp}.tar.gz"

# 進入父目錄打包(避免絕對路徑導致解包路徑固定)
cd "$(dirname "$target_dir")"
if [[ -f "$archive_name" ]]; then
    rm -f "$archive_name"
fi

echo "[$(date)] Starting backup of $target_dir -> $backup_root/$archive_name"
tar -zcf "$archive_name" "$dir_name"

# 移動到備份目錄
mv "$archive_name" "$backup_root/"

# 清理超期備份(保留 retain_days 天)
find "$backup_root" -type f -name "${dir_name}*.tar.gz" -mtime +"$retain_days" -exec rm -f {} \;

echo "[$(date)] Backup completed. Retained last $retain_days days."
ls -lh "$backup_root"/${dir_name}*.tar.gz

使用示例

# 備份 /home/wwwroot 到 /backup/web,保留 7 天
sh filebak.sh /home/wwwroot /backup/web 7

# 備份 /data/app 到 /mnt/backup/app,保留 30 天
sh filebak.sh /data/app /mnt/backup/app 30

Crontab 定時調度範例

編輯當前用戶 Crontab:crontab -e

調度需求Crontab 表達式說明
每天凌晨 1 點0 1 * * * /path/to/filebak.sh /home/wwwroot /backup/web 7 >/dev/null 2>&1最常用,夜間低峰
每周一凌晨 1 點0 1 * * 1 /path/to/filebak.sh /home/wwwroot /backup/web 7周級全量
每 2 小時0 */2 * * * /path/to/filebak.sh /home/wwwroot /backup/web 7高頻業務,注意磁盤 IO
每 2 天0 0 */2 * * /path/to/filebak.sh /home/wwwroot /backup/web 7隔日備份
每月 5 號 1:2020 1 5 * * /path/to/filebak.sh /home/wwwroot /backup/web 7月度歸檔

進階優化建議

  1. 增量備份:配合 tar --listed-incremental=snapshot.file 實現增量,大幅減小體積與時間。
  2. 遠程傳輸:備份後 rsync -avz /backup/ user@remote:/offsite/ 或上傳至 S3/OSS/COS。
  3. 校驗完整性:sha256sum 記錄校驗值,恢復前驗證。
  4. 日志輪轉:腳本輸出重定向到 /var/log/filebak.log,配合 logrotate。
  5. 鎖機制防並發:flock -n /var/lock/filebak.lock -c "..." 避免上次未結束新任務啟動。

MySQL 資料庫備份延伸

同目錄下另有 mysqlbak.sh 支持多實例、多庫、遠程備份,參考:


作者: yxy (www.sql8.net, anybooks@qq.com) | 日期:2014-08-20

Copyright © Windows教程網 All Rights Reserved