crontab 是 linux 自动化备份最常用、最可靠的底层工具,关键在于长期稳定不出错:脚本需独立可执行并含防护逻辑,crontab 条目须用绝对路径和显式环境,必须记录日志并校验结果,集群场景还需协调防冲突。

Crontab 是 Linux 自动化备份最常用、最可靠的底层工具,它不复杂,但细节决定成败。关键不是“能不能跑起来”,而是“能不能长期稳定不出错”。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
备份脚本必须独立可执行且带防护逻辑
脚本不是写完就完事,要能脱离 crontab 环境单独运行成功:
- 开头明确声明解释器:
#!/bin/bash - 检查源目录是否存在,不存在则退出并记录错误
- 目标路径提前创建(用
mkdir -p),避免因目录缺失导致备份失败 - 文件名强制嵌入时间戳,格式推荐
%Y%m%d_%H%M%S,避免覆盖 - 备份后校验压缩包是否有效:
tar -tzf backup_*.tar.gz >/dev/null 2>&1,失败则写日志并退出
Crontab 条目必须用绝对路径 + 显式环境
crond 的默认环境极简,PATH 常只有 /usr/bin:/bin,很多命令(如 mysqldump、rsync)会找不到:
- 脚本路径写全:
/home/app/scripts/backup.sh,不能用~/scripts/backup.sh - 在脚本开头设置完整 PATH:
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH - 数据库命令务必用绝对路径调用:
/usr/bin/mysqldump --single-transaction --routines --triggers --events mydb > /backup/db_$(date +\%F_\%H%M).sql - 密码绝不出现在命令行,MySQL 应使用
~/.my.cnf(权限600),PostgreSQL 用.pgpass
日志与错误捕获不能省略
没有日志的定时任务等于盲操作:
- Crontab 条目末尾重定向输出:
0 2 * * * /home/app/backup.sh >> /var/log/backup.log 2>&1 - 脚本内部也建议加时间戳日志:
echo "$(date): Starting backup..." >> /var/log/backup.log - tar 或 mysqldump 执行后检查
$?,非零值立即记录失败并退出,防止“看似运行实则空包”
集群场景需额外协调策略
单机备份容易,多节点集群要防冲突、保一致:
- 各节点脚本开头读取
hostname或NODE_ROLE环境变量,区分主从动作(主库全量 dump,从库只存日志快照) - 备份命令前加随机延迟:
sleep $((RANDOM % 300)),避免所有节点同一秒打满磁盘和网络 - 文件名含主机名:
backup_$(hostname)_$(date +\%Y%m%d_\%H%M).tar.gz - 本地备份完成后,用
rsync或rclone推送到共享存储,由专用归档节点统一清理旧文件
不复杂但容易忽略。










