Linux自动备份:定时执行与失败检查

适用环境:Bash、GNU tar、sha256sum、util-linux flock 与 cron 可用的 Linux;示例操作账号可读源目录、可写备份目录。创建 /usr/local/sbin 下脚本通常需管理员权限,脚本安装应由管理员完成;定时运行使用已安排好的账号。仅适用静态文件或已另行保证一致性的目录。

先让脚本手动运行成功,再加入定时任务。脚本不会自动暂停数据库或业务写入,也不会自动删除旧备份;数据库应使用经过验证的数据库备份工具。下面将脚本保存到自己管理的绝对路径,例如 /usr/local/sbin/baole-static-backup.sh,文件不能由无关账号修改。

建立可以判断成败的脚本

#!/usr/bin/env bash
set -euo pipefail
umask 077
PATH=/usr/sbin:/usr/bin:/sbin:/bin
source_dir=/srv/example-static
backup_root=/var/backups/baole
test -d "$source_dir"
mkdir -p -- "$backup_root"
exec 9>"$backup_root/.backup.lock"
flock -n 9 || { printf '%s\n' '已有备份运行,本次退出'; exit 75; }
run_dir=$(mktemp -d "$backup_root/run.XXXXXXXX")
trap 'rc=$?; if [ "$rc" -ne 0 ]; then printf "FAILED rc=%s dir=%s\n" "$rc" "$run_dir" >&2; fi' EXIT
tar -czf "$run_dir/files.tar.gz.partial" -C "$(dirname "$source_dir")" "$(basename "$source_dir")"
gzip -t "$run_dir/files.tar.gz.partial"
tar -tzf "$run_dir/files.tar.gz.partial" >/dev/null
mv -- "$run_dir/files.tar.gz.partial" "$run_dir/files.tar.gz"
(cd "$run_dir" && sha256sum -- files.tar.gz > SHA256SUMS)
printf 'COMPLETE %s %s\n' "$(date -Is)" "$run_dir"

先修改 source_dir 和 backup_root,保证备份目录在源目录之外且空间充足。flock 防止两次任务重叠,失败时保留本次目录供检查;.partial 不算有效成品。该锁只协调使用同一锁文件的脚本,不能替代业务数据一致性控制。

按实际运行账号手动试一次

chmod 700 /usr/local/sbin/baole-static-backup.sh
/bin/bash /usr/local/sbin/baole-static-backup.sh
printf 'script exit=%s\n' "$?"

使用计划运行任务的同一个账号测试。必须得到退出码 0,并在 COMPLETE 指向的目录中找到能验证和试解压的备份。脚本被拒绝读取文件或创建目录时,先解决账号权限与路径;不要为了运行成功把业务目录全部开放写权限。

加入当前账号的crontab

先查看 date 和 timedatectl,确认服务器实际时区及准备执行的时间;不要假定它与本地电脑一致。执行 crontab -e,在保留原有任务的前提下添加一行:

30 3 * * * /bin/bash /usr/local/sbin/baole-static-backup.sh >> /var/backups/baole/cron-backup.log 2>&1

此例表示服务器本地时间每天 03:30;日志所在目录必须已经存在,并允许任务账号写入。当前账号的 crontab 不加额外用户名字段。不要用 crontab - 覆盖不明内容,也不要用 crontab -r 清掉其他任务。日期格式中的 % 放在脚本里,避免 crontab 自身对 % 的特殊解释。

定时触发后怎样验收

  • 用 crontab -l 确认条目仍在;查看日志中对应时段是否出现 COMPLETE,还是 FAILED 或锁冲突。
  • 打开这次打印的目录,检查日期、文件大小、SHA256和试解压结果。任务触发不等于备份成功。
  • 检查服务器是否在该时段运行;关机期间错过的普通cron任务不能当成已经补跑。
  • 给日志和历史批次安排容量监测、保留策略与失败通知。只有日志而从不检查,不算自动备份闭环。