crontab 五字段语法
cron 用五个字段描述执行时机,后面接要执行的命令:分钟、小时、日、月、星期。特殊符号只有四种——* 表示任意值、逗号枚举多个值、短横线表示范围、斜杠表示步进。最容易踩的坑是「日」与「周」同时被限定时,二者是或关系:0 0 1 * 1 表示每月 1 号或每周一都执行,而不是「既是 1 号又是周一」。另外 crontab 的执行环境非常精简,PATH 很短、没有登录 shell 的变量,脚本里写绝对路径几乎总是必要的。
基本信息
| 适用平台 | Linux(cronie、vixie-cron);systemd 系统可以用 timer 单元替代,精度可到秒级 |
|---|---|
| 命令语法 | 分 时 日 月 周 命令;用户任务由 crontab -e 编辑,系统任务在 /etc/crontab 与 /etc/cron.d/ 中多一列用户名 |
| 字段范围 | 分钟 0-59、小时 0-23、日 1-31、月 1-12、星期 0-7(0 与 7 都表示周日) |
| 辅助写法 | @reboot、@daily、@weekly、@monthly、@yearly 作为五字段的快捷替代 |
| 权限控制 | crontab -e 编辑自己的任务;写 /etc/cron.d/ 需要 root;/etc/cron.allow 与 /etc/cron.deny 决定哪些用户能使用 cron |
典型使用场景
- 定时清理:每天凌晨清理过期日志与临时文件,配合 find 按时间筛选
- 周期备份:每小时或每天做增量备份,错开业务高峰并加锁避免任务重叠
- 健康检查:每 5 分钟探测本地服务端口,失败时记录或触发告警
- 报表与汇总:每周一早上生成上周数据报表并邮件发送
- 证书与凭据检查:定期检查即将过期的证书并提前提醒续期
- 临时任务:用 crontab -e 快速挂一个一次性任务,用完删除
字段速查
| 字段 | 允许值 | 特殊符号 |
|---|---|---|
| 分钟 | 0-59 | * , - / |
| 小时 | 0-23 | * , - / |
| 日 | 1-31 | * , - / |
| 月 | 1-12 或 jan-dec | * , - / |
| 星期 | 0-7(0 和 7 都是周日)或 sun-sat | * , - / |
常见写法
常见写法
0 3 * * * /opt/scripts/backup.sh # 每天 03:00
*/10 * * * * /opt/scripts/check.sh # 每 10 分钟
0 9-18/2 * * 1-5 /opt/scripts/sync.sh # 工作日 9-18 点每 2 小时
0 0 1,15 * * /opt/scripts/report.sh # 每月 1 日与 15 日
30 4 * * 0,6 /opt/scripts/task.sh # 周六日 04:30
0 0 1 * 1 /opt/scripts/x.sh # 1 日或周一执行(或关系)
@reboot /opt/scripts/warmup.sh # 每次开机执行
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO="" # 不发送任务输出邮件
30 2 * * * flock -n /var/lock/backup.lock /opt/scripts/backup.sh # 防止任务重叠cron 的最小粒度是分钟,需要秒级或更精确的触发应改用 systemd timer(OnCalendar 支持秒与更丰富的表达式)。cron 使用的是系统时区,跨时区团队要留意基准;修改系统时区会连带改变所有任务的执行时刻。
任务输出默认通过邮件发给任务所属用户,本地没有邮件系统时会静默丢弃并在日志里留下记录。不需要邮件就设置 MAILTO="";需要留痕则把命令输出重定向到日志文件,便于事后核对执行结果。排查「任务没执行」时先看 cron 自身的执行记录(RHEL 系 /var/log/cron,Debian 系看 /var/log/syslog 或 journalctl -u cron):有记录说明脚本本身出错,没有任何记录则先查语法、权限与 cron 服务状态。
长耗时任务要防重叠:如果执行时间可能超过触发间隔,用 flock -n 加锁,避免上一次还没结束下一次又启动,造成资源竞争与数据错乱。另外 crontab -r 会一次性删除该用户的全部任务且没有确认提示,它和 -e 只差一个字母。
存放位置与生效方式:用户任务由 crontab -e 编辑后立即生效,保存在 /var/spool/cron/ 下;系统级任务写在 /etc/crontab 与 /etc/cron.d/ 里,多一列用户名,字段顺序与用户 crontab 不同,直接复制粘贴会报错。排查「任务没执行」时,先确认 cron 服务在运行(systemctl status crond 或 cron),再确认任务写在了哪一类文件里、语法是否符合该文件的格式。