crontab 定时任务详解:五段式时间语义、数据库备份实战、%转义与故障排查全攻略


一、crontab 是什么,能帮我做什么

crontab 是 Linux 下最经典的定时任务工具。你写下一行"在某时某分执行某个命令"的时间规则,crond 守护进程就会到点自动执行,比如:每天凌晨 3 点备份数据库、每隔 5 分钟拉取一次库存、每周日清理几天前的日志、每月 1 号发月度报表。只要服务器不关机,这些任务就会像上了发条一样准时跑。

相比 systemd timer,crontab 的优势是简单直观、任何 Linux 发行版默认都有,运维排查和排障成本最低。

二、crontab 基本操作

crontab 针对当前登录用户,几个核心命令:

crontab -l        # 列出当前用户的定时任务
crontab -e        # 编辑当前用户的定时任务
crontab -r        # 清空当前用户的定时任务(慎用)
crontab -u root -l # 以 root 身份看其他用户任务,需权限

用 crontab -e 编辑时,默认会打开 vi/nano 编辑器,每行一条任务,写错会直接校验并提示。

三、认识时间字段:五段式

每行任务由"五段时间 + 命令"组成,顺序固定:

分  时  日  月  星期  命令
*   *   *   *   *    /path/to/command
  • 分:0-59
  • 时:0-23
  • 日:1-31
  • 月:1-12
  • 星期:0-7,其中 0 和 7 都代表周日

常用特殊符号:* 表示任意值;逗号, 表示枚举(1,15);连字符- 表示区间(1-5);斜杠/ 表示步长(*/5 表示每 5 分钟)。

几个高频写法:

*/5 * * * *          # 每 5 分钟
30 2 * * *           # 每天 02:30
30 3 * * 0           # 每周日 03:30
0 6 1 * *            # 每月 1 号 06:00
0 4 15 * 3           # 每月 15 号且是周三时 04:00(日与星期取或)
30 23 * * 1-5        # 工作日 23:30

四、写任务的几个关键坑

  1. 命令要用绝对路径。crontab 环境变量很少且没有继承你的 shell 环境,cron 默认 PATH 不足,直接写命令名常会"找不到命令"。用 which 查出绝对路径:
which mysql php rsync
# 结果形如 /usr/bin/mysql,写进任务时都用绝对路径
  1. 输出重定向到日志。任务默认只发邮件,不落文件,容易"跑了却看不出结果"。建议标准和错误输出都导入日志:
30 3 * * * /usr/bin/mysqldump -u root 库名 > /var/log/mysql_backup.log 2>&1
  1. 想立即看到任务是否真的执行,编辑后先手动跑一次命令验证返回值,再看日志尾部:
tail -n 20 /var/log/mysql_backup.log

五、实战:数据库定时备份与日志清理

每天凌晨 3 点全库备份,并保留最近 7 天的备份文件:

0 3 * * * /usr/bin/mysqldump -u备份用户 -p密码 库名 | gzip > /backup/db_$(date +\%Y\%m\%d).sql.gz

注意:在 crontab 里写日期,% 需要转义成 \%%,否则会被 cron 当作换行截断。

配合保留周期,可以再写一条:

0 4 * * * find /backup/ -name "*.sql.gz" -mtime +7 -delete

这样每天凌晨自动备份、自动清理 7 天前旧备份,几乎零人工维护。

六、任务不执行怎么排查

  1. crontab -l 确认任务真的保存了。
  2. 检查 crond 服务是否在运行:systemctl status crond(CentOS)或 systemctl status cron(Debian/Ubuntu)。
  3. 看系统 cron 日志:Ubuntu 看 /var/log/syslog 或 /var/log/cron,CentOS 看 /var/log/cron,grep 你的命令关键字。
  4. 环境变量问题、绝对路径问题、脚本无执行权限 chmod +x 都常是元凶。
  5. 时间时区问题:服务器时区若非 Asia/Shanghai,任务会按服务器本地时间执行,先 timedatectl 确认。

写在最后

crontab 看似只是"一行时间 + 一条命令",但真正把它用好,靠的是理解五段式的时间语义、坚持使用绝对路径、做好输出日志,以及牢记 % 转义和权限这两个大坑。从数据库备份、日志清理到数据采集、报表生成,crontab 都是一名服务器运维最顺手、最可靠的定时利器。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

Nginx 反向代理与负载均衡配置实战:proxy_pass、upstream 权重、健康检查一网打尽

Linux Swap 虚拟内存配置详解:swap 文件/分区、swappiness 调优,低配 VPS 告别 OOM

评 论
更换验证码