生產環境 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 -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:20 | 20 1 5 * * /path/to/filebak.sh /home/wwwroot /backup/web 7 | 月度歸檔 |
tar --listed-incremental=snapshot.file 實現增量,大幅減小體積與時間。rsync -avz /backup/ user@remote:/offsite/ 或上傳至 S3/OSS/COS。sha256sum 記錄校驗值,恢復前驗證。/var/log/filebak.log,配合 logrotate。flock -n /var/lock/filebak.lock -c "..." 避免上次未結束新任務啟動。同目錄下另有 mysqlbak.sh 支持多實例、多庫、遠程備份,參考:
作者: yxy (www.sql8.net, anybooks@qq.com) | 日期:2014-08-20