高效备份脚本只做三件事:绝对路径调用 /bin/tar -czf 打包、/usr/bin/rsync -az --delete 同步、/usr/bin/find ... -mtime +7 -delete 清理;每步记录时间戳日志,检查 $? 失败即退出并邮件告警;数据库用 mysqldump --login-path=local 规避密码明文风险。

写一个高效率的 Linux 服务器自动备份 Cron 脚本,关键不是堆功能,而是稳、准、轻、可查——路径全用绝对路径,操作有日志,失败能感知,旧文件自动清,权限和环境不踩坑。
脚本结构要精简,只做三件事
一个高效备份脚本应聚焦核心链路:打包 →(可选)同步 → 清理。避免在脚本里做判断分支、网络探测或复杂配置解析。
- 用 tar -czf 打包压缩,加 --exclude 过滤临时文件、日志、缓存目录
- 远程同步用 rsync -az --delete,前提是已配好 SSH 免密登录
- 清理旧备份统一用 find ... -mtime +N -delete,不依赖额外工具
- 所有路径(包括 tar 的
-C目录、日志路径、备份目标路径)必须写绝对路径,比如/usr/bin/tar而非tar
crontab 配置必须避开环境陷阱
cron 执行时的环境变量极简(PATH 通常只有 /usr/bin:/bin),直接写 tar 或 mysqldump 很可能报“command not found”。
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 在 crontab 条目开头显式声明 PATH,例如:
PATH=/usr/local/bin:/usr/bin:/bin<br>0 2 * * * /opt/scripts/backup.sh
- 或者脚本第一行加
#!/bin/bash -l(加载用户环境),但不如显式 PATH 可控 - 避免使用
~符号,全部替换为/root或/home/username - 测试时用
run-parts --test /etc/cron.daily或手动模拟 cron 环境:env -i PATH=/usr/bin:/bin /opt/scripts/backup.sh
日志和错误反馈必须闭环
没有日志的备份等于没备;没有失败通知的备份等于埋雷。
- 每条关键操作后加时间戳记录,例如:
echo "[$(date '+%F %T')] Starting backup..." >> /var/log/backup.log - 命令执行后立刻检查
$?,失败时写日志并exit 1,防止后续误操作 - 把标准输出和标准错误都重定向到日志:
mysqldump db | gzip > file.sql.gz >> /var/log/backup.log 2>&1 - 可加一行邮件提醒(需系统已配好 mail 命令):
if [ $? -ne 0 ]; then echo "Backup failed at $(date)" | mail -s "Backup Alert" admin@example.com; fi
数据库备份要绕开密码明文风险
脚本里写 DB_PASS="xxx" 是严重安全隐患,生产环境必须禁用。
- 用
mysql_config_editor创建加密登录路径:mysql_config_editor set --login-path=local --user=root --password - 然后脚本中直接调用:
mysqldump --login-path=local dbname | gzip > backup.sql.gz - 确保
~/.mylogin.cnf权限为600:chmod 600 ~/.mylogin.cnf - 如用
.my.cnf,也要设为600,且仅对 root 可读

















