Linux服务器自动备份关键在于cron准时调用健壮脚本:需固定PATH、set -e退出、带时间戳命名、排除无关目录、生成校验码、绝对路径调用、日志重定向、安全传参、按时间清理旧备份、检查磁盘空间及失败告警。

Linux 服务器数据自动备份,核心是让 cron 稳稳跑起来,而不是“设完就忘”。它不保证成功,只负责准时调用脚本;真正靠得住的,是你写的脚本是否健壮、路径是否写死、失败有没有反馈。
写一个靠谱的备份脚本
脚本不是简单打包,得能自检、防中断、留痕迹:
- 开头固定解释器和 PATH:
#!/bin/bash+PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH - 用
set -e让任意命令失败立刻退出,避免生成残缺备份包 - 文件名带精确时间戳:
backup_$(date +\%Y\%m\%d_\%H\%M).tar.gz,避免覆盖 - 排除无意义目录:
--exclude='/tmp/*' --exclude='/proc/*' --exclude='/sys/*' - 压缩后立即生成校验文件:
md5sum backup_*.tar.gz > backup_*.md5
用 crontab 安排执行,但别信默认环境
cron 执行时没有你的 shell 环境,PATH 极简,HOME 可能为空。直接写 mysqldump 或 rsync 很可能报“command not found”:
- crontab 条目必须用绝对路径调用脚本,例如:
0 2 * * * /root/scripts/backup.sh - 日志重定向不能省:
>> /var/log/backup.log 2>&1,否则失败无声无息 - 如果脚本里调用数据库工具,也必须写全路径,如
/usr/bin/mysqldump或/usr/bin/pg_dump - 密码别硬编码在命令行(会暴露在
ps输出里),改用~/.my.cnf或PGPASSFILE
加一层清理逻辑,按天数而非数量删
“保留最近 7 个备份”看似合理,但某天 cron 失败或服务器关机,就会少一个——结果可能只剩 4 个。按时间清理更可靠:
- 清理备份包:
find /backup -name "backup_*.tar.gz" -mtime +7 -delete - 同步清理对应校验文件:
find /backup -name "backup_*.md5" -mtime +7 -delete - 执行前先用
-print测试,确认要删的是哪些文件 - 不要对整个备份目录
rm -rf,防止误删正在写入的文件
磁盘空间和失败告警是最后一道防线
备份失败不可怕,备份到一半因磁盘满而中断,还留下损坏文件才麻烦:
- 脚本开头检查目标分区剩余空间,例如:
FREE_KB=$(df /backup | awk 'NR==2 {print $4}'); [ $FREE_KB -lt 5242880 ] && exit 1(即低于 5GB) - 备份命令执行后检查退出码:
if [ $? -ne 0 ]; then echo "$(date): backup failed" | mail -s "Backup Alert" admin@example.com; fi - 定期翻看
/var/log/backup.log,重点搜No space left、Permission denied、Connection refused


















