Shell 脚本入门:用 Bash 写一个可复用的备份脚本

举报
yd_248904582 发表于 2026/11/06 06:05:20 2026/11/06
【摘要】 备份这件事,平时没人想起它,出问题时却能决定一个晚上是加班还是安心睡觉。很多新手第一次写备份脚本,都是直接敲一行 tar 命令了事;等到真正需要恢复时,才发现备份文件不知道去哪了、旧备份把磁盘塞满了、脚本半夜报错也没人知道。本文就用一个可复用的 Bash 备份脚本,把这些坑一次填平。 一、先想清楚:备份脚本要解决什么问题一个能长期跑下去的备份脚本,至少要做到四件事:第一,备份内容可配置,换一...

备份这件事,平时没人想起它,出问题时却能决定一个晚上是加班还是安心睡觉。很多新手第一次写备份脚本,都是直接敲一行 tar 命令了事;等到真正需要恢复时,才发现备份文件不知道去哪了、旧备份把磁盘塞满了、脚本半夜报错也没人知道。本文就用一个可复用的 Bash 备份脚本,把这些坑一次填平。

一、先想清楚:备份脚本要解决什么问题

一个能长期跑下去的备份脚本,至少要做到四件事:第一,备份内容可配置,换一个目录不用改脚本;第二,每次备份生成带日期的文件名,方便按时间找回;第三,自动清理过期的旧备份,避免磁盘被撑爆;第四,备份失败要能被发现,而不是悄悄失败。

二、一个可复用的备份脚本

把下面的内容保存为 backup.sh,改一改开头的三个变量就能用:

#!/bin/bash
set -euo pipefail

# ===== 可配置项:只改这里 =====
SRC_DIR="/home/yd_248904582/data"   # 需要备份的目录
BACKUP_DIR="/home/yd_248904582/backup" # 备份文件存放目录
KEEP_DAYS=7                          # 旧备份保留天数

# ===== 以下一般不用改 =====
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/backup_${DATE}.tar.gz"
LOG_FILE="${BACKUP_DIR}/backup.log"

mkdir -p "$BACKUP_DIR"

log() {
  echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}

log "开始备份:${SRC_DIR}"

if [ ! -d "$SRC_DIR" ]; then
  log "错误:源目录不存在,备份退出"
  exit 1
fi

tar -czf "$BACKUP_FILE" -C "$(dirname "$SRC_DIR")" "$(basename "$SRC_DIR")"

log "备份完成:${BACKUP_FILE},大小 $(du -h "$BACKUP_FILE" | cut -f1)"

# 删除超过保留天数的旧备份
find "$BACKUP_DIR" -name 'backup_*.tar.gz' -mtime +"$KEEP_DAYS" -delete
log "已清理 ${KEEP_DAYS} 天前的旧备份"

给脚本加上可执行权限,然后手动跑一次验证:

chmod +x backup.sh
./backup.sh
ls -lh ~/backup/

三、脚本里值得注意的三个细节

第一行 set -euo pipefail 是很多新手容易忽略的“安全开关”:遇到命令失败立即退出、用到未定义变量就报错、管道中任何一段失败都算失败。没有它,tar 打包失败了脚本还会继续往下走,甚至把空文件当成备份成功。

第二个细节是文件名里带上日期和时间 backup_20261106_060000.tar.gz,这样每天的备份互不覆盖,恢复时一眼就能找到想要的那一份。

第三个细节是 find -mtime +7 -delete 的自动清理。备份最怕“只进不出”,保留 7 天、每天一份,对个人项目来说通常够用;如果磁盘紧张,可以把 KEEP_DAYS 改成 3。

四、让它每天自动跑起来

手动备份靠记性是靠不住的,交给 cron 每天凌晨自动执行:

crontab -e

在打开的文件末尾加上一行,每天 2 点执行脚本:

0 2 * * * /home/yd_248904582/backup.sh >> /home/yd_248904582/backup/cron.log 2>&1

加完之后可以用 crontab -l 确认是否写进去了,第二天早上检查一下 backup.log,确认新备份已经生成。

五、恢复演练:备份的价值在恢复那一刻才兑现

备份做完不等于万事大吉,至少要演练一次恢复。找一个临时目录解压备份文件,确认里面的内容和原来一致:

mkdir -p /tmp/restore_test
tar -xzf ~/backup/backup_20261106_060000.tar.gz -C /tmp/restore_test
ls -R /tmp/restore_test | head -20

如果解压报错或者内容不对,说明备份流程本身有问题,越早发现越好。建议每个月至少做一次这样的恢复演练。

六、还可以继续完善的方向

这个脚本已经能满足日常使用,如果想再进一步,可以考虑三个方向:备份前先检查磁盘剩余空间,不够就提前告警;备份完成后计算校验和,恢复前先校验文件完整性;把备份文件再同步一份到对象存储或另一台机器,做到异地容灾。

备份脚本的价值不在于写得多复杂,而在于它每天都在、每次都成功、需要时真的能恢复。先把上面这个 40 行左右的脚本跑起来,再根据自己的需求慢慢加功能,就是最好的入门路径。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。