前言
服务器备份是运维的保命符。别等数据丢了才想起写备份脚本。本文直接用 crontab 配合 shell 脚本,搞定自动化备份,从语法到排障一步到位。

crontab 定时任务语法速查与实战
时间表达式到底怎么写才不会翻车?
crontab 的时间格式分五段:分、时、日、月、周。别死记硬背,记住几个常用组合就行。
每天凌晨 2 点执行
0 2 * * * /path/to/backup.sh
每 5 分钟执行一次
*/5 * * * * /path/to/check.sh
每周一凌晨 3 点执行
0 3 * * 1 /path/to/weekly_backup.sh
每月 1 号和 15 号凌晨 4 点执行
0 4 1,15 * * /path/to/monthly_backup.sh
老手才知道的坑:`%` 在 crontab 里有特殊含义(换行符),如果脚本路径或参数里包含 `%`,必须用反斜杠转义。另外,`*` 代表“每一个”,不是“任意一个”。
用 crontab -e 还是直接写文件?
两种方式都行,但推荐直接用 `crontab -e`,它自动校验语法,万一写错了会提示,避免让系统执行一个格式错误的定时任务。
编辑当前用户的 crontab
crontab -e
查看当前用户的定时任务列表
crontab -l
删除当前用户的所有定时任务(谨慎操作)
crontab -r
如果需要在脚本里动态写入 crontab,可以用 `echo` 配合管道符,但别直接覆盖文件 `/var/spool/cron/`,那会出权限问题。
实战备份脚本:从数据库到网站文件
编写一个能自动压缩并清理旧备份的脚本
下面这个脚本适用于大多数 WordPress 站点,备份 MySQL 数据库和网站目录,并保留最近 7 天的备份。
#!/bin/bash
备份脚本:backup.sh
请先修改以下三个变量为你的实际路径和数据库信息
BACKUP_DIR=”/data/backups” # 备份文件存放目录
WEB_DIR=”/var/www/html” # 网站根目录
DB_NAME=”wordpress_db” # 数据库名
DB_USER=”root” # 数据库用户名
DB_PASS=”your_password_here” # 数据库密码
创建日期变量,用于区分备份文件
DATE=$(date +%Y%m%d_%H%M%S)
备份数据库
mysqldump -u $DB_USER -p$DB_PASS $DB_NAME > $BACKUP_DIR/db_$DATE.sql
打包网站目录
tar -czf $BACKUP_DIR/web_$DATE.tar.gz $WEB_DIR
删除 7 天前的备份文件
find $BACKUP_DIR -name “*.sql” -mtime +7 -exec rm -f {} \;
find $BACKUP_DIR -name “*.tar.gz” -mtime +7 -exec rm -f {} \;
输出完成提示
echo “Backup completed at $DATE”
别忘了给脚本执行权限,否则 crontab 跑不起来。
chmod +x backup.sh
把脚本挂到 crontab 上
假设脚本放在 `/root/backup.sh`,每天凌晨 3 点自动备份。
crontab -e
在文件末尾添加一行:
0 3 * * * /root/backup.sh >> /var/log/backup.log 2>&1
把输出重定向到日志文件,方便排查。万一报错了别慌,先看日志。
排障指南:定时任务没执行怎么办?
先查日志,别瞎猜
crontab 的执行日志一般写在系统日志里,不同发行版位置不同。
CentOS / RHEL
grep CRON /var/log/cron
Ubuntu / Debian
grep CRON /var/log/syslog
常见的报错有两类:一是脚本路径写错了,二是脚本里用了相对路径。crontab 的执行环境是极简的,PATH 变量可能不包含 `/usr/local/bin`,所以脚本里最好用绝对路径。
老鸟叮嘱:一个高风险操作
千万别在 crontab 里直接执行 `rm -rf /` 这种命令,哪怕你是想清理临时文件。写脚本时,变量赋值一定要检查,比如 `BACKUP_DIR` 如果为空,`rm -rf $BACKUP_DIR/*` 就会变成 `rm -rf /*`,后果你懂的。
建议在删除命令前加一个判断:
if [ -n “$BACKUP_DIR” ]; then
find $BACKUP_DIR -name “*.sql” -mtime +7 -exec rm -f {} \;
fi
FAQ
Linux crontab 定时任务不执行是什么原因?
最常见的原因是脚本路径写错了,或者脚本没有执行权限。另外检查 cron 服务是否在运行:`systemctl status crond`。
VPS 上 crontab 备份脚本权限怎么设置?
脚本文件建议设置为 700 权限,只允许 root 执行。数据库备份文件如果包含明文密码,也要限制权限,或者用 `~/.my.cnf` 文件代替命令行密码。
Linux 小白可以直接用 root 账号操作 crontab 吗?
可以,但建议先用普通用户测试脚本,确认无误后再用 root 添加定时任务。直接用 root 操作时,一定要小心 `rm -rf` 和 `>` 覆盖文件。
crontab 里 % 符号怎么处理?
在 crontab 命令中,`%` 表示换行符。如果在参数里需要用到 `%`,必须用反斜杠转义,比如 `date +\%Y\%m\%d`。
备份脚本执行了但没生成文件,怎么排查?
先检查脚本是否有语法错误: -n backup.sh`。然后手动执行一次脚本,看输出信息。最后检查备份目录的磁盘空间是否满了:`df -h`。
BBR 开启后 crontab 会受影响吗?
不会。BBR 是 TCP 拥塞控制算法,影响的是网络性能,跟定时任务调度无关。两者是不同层面的服务。
转载请注明出处:https://www.zhujixuan.com/jishujiaocheng/9419.html 商家投稿邮箱:zhujixuanblog@qq.com
