一、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
四、写任务的几个关键坑
- 命令要用绝对路径。crontab 环境变量很少且没有继承你的 shell 环境,cron 默认 PATH 不足,直接写命令名常会"找不到命令"。用 which 查出绝对路径:
which mysql php rsync # 结果形如 /usr/bin/mysql,写进任务时都用绝对路径
- 输出重定向到日志。任务默认只发邮件,不落文件,容易"跑了却看不出结果"。建议标准和错误输出都导入日志:
30 3 * * * /usr/bin/mysqldump -u root 库名 > /var/log/mysql_backup.log 2>&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 天前旧备份,几乎零人工维护。
六、任务不执行怎么排查
- crontab -l 确认任务真的保存了。
- 检查 crond 服务是否在运行:systemctl status crond(CentOS)或 systemctl status cron(Debian/Ubuntu)。
- 看系统 cron 日志:Ubuntu 看 /var/log/syslog 或 /var/log/cron,CentOS 看 /var/log/cron,grep 你的命令关键字。
- 环境变量问题、绝对路径问题、脚本无执行权限 chmod +x 都常是元凶。
- 时间时区问题:服务器时区若非 Asia/Shanghai,任务会按服务器本地时间执行,先 timedatectl 确认。
写在最后
crontab 看似只是"一行时间 + 一条命令",但真正把它用好,靠的是理解五段式的时间语义、坚持使用绝对路径、做好输出日志,以及牢记 % 转义和权限这两个大坑。从数据库备份、日志清理到数据采集、报表生成,crontab 都是一名服务器运维最顺手、最可靠的定时利器。
