1. 首页 > 技术教程 > 正文

自动化备份:crontab 定时任务语法+实战备份脚本

前言

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

自动化备份:crontab 定时任务语法+实战备份脚本的图片

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