配置 cron 自动备份需确保任务可靠、可查、可维护:脚本须自包含、路径绝对、日志清晰、失败可知;环境变量显式声明,命令用绝对路径;数据库密码不暴露于命令行;调度防冲突并留备份窗口;文件命名含主机名与时间戳,按用途隔离存储;脚本内嵌清理逻辑;日志重定向且每步校验状态,失败时触发告警。

配置 Cron 任务实现自动备份,关键不在“加一条定时命令”,而在于让任务真正可靠、可查、可维护。它需要脚本健壮、路径明确、日志清晰、失败可知。
备份脚本必须自包含且路径绝对
Cron 执行环境极简,PATH、HOME、SHELL 都与登录会话不同,脚本里任何依赖默认环境的写法都可能失败。
- 脚本开头固定解释器:#!/bin/bash(不推荐#!/usr/bin/env bash,避免环境不可控)
- 立即声明 PATH:PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH
- 所有命令用绝对路径:/bin/tar、/usr/bin/mysqldump、/usr/bin/find,不靠 shell 自动查找
- 数据库密码不写在命令行(防泄露),改用 ~/.my.cnf 或 --defaults-extra-file 参数方式
时间调度要防冲突、带延迟、留窗口
集群或多任务场景下,多个备份同时启动容易打满磁盘 I/O 或网络带宽。
- 避免所有节点统一整点触发,用 sleep $((RANDOM % 300)) 延迟 0–5 分钟
- Crontab 条目写成:0 2 * * * /bin/bash -c 'sleep $((RANDOM % 300)); /home/app/backup.sh' >> /var/log/backup.log 2>&1
- 确保使用 /bin/bash(不是 /bin/sh),否则 $(( )) 算术扩展会报错
- 备份窗口建议避开业务高峰,例如选凌晨 2:00–4:00,给失败重试留出余量
命名与归档需带标识、分路径、控保留
备份文件没标识、混放一处,后期根本分不清是谁、哪天、什么内容,也极易误删。
- 文件名含 hostname 和时间戳:backup_$(hostname)_$(date +\%Y\%m\%d_\%H\%M).tar.gz
- 目标目录按节点或用途隔离:/backup/db/、/backup/web/、/backup/logs/
- 脚本内嵌清理逻辑:find /backup/db -name "backup_*.tar.gz" -mtime +7 -type f -delete
- 集中归档由专用节点执行(如 NFS 服务端),各节点只负责本地生成+推送,职责分离
日志与告警是唯一可信的运行证据
没有日志的定时任务等于没做;没有错误捕获的备份,失败了你也看不见。
- Crontab 条目末尾必须重定向:>> /var/log/backup.log 2>&1
- 脚本中每一步加状态判断:if [ $? -ne 0 ]; then echo "$(date) ERROR: tar failed" >&2; exit 1; fi
- 关键步骤记录时间戳和退出码:echo "$(date +%s) backup_start" >> /var/log/backup.trace
- 简单告警可用 mail 或 curl 推送:备份失败时向企业微信/钉钉机器人发通知(需提前配置 token)











