首页/系统/Linux 运维命令速查/crontab 五字段语法与特殊符号
定时任务与计划50 条

crontab 五字段语法与特殊符号

分 时 日 月 周 五列决定执行时机:* 任意、, 枚举、- 范围、/ 步进;日与周同时限定时是「或」关系,最容易被忽略。

Linux 运维命令速查系统更新于 2026-10-13

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),再确认任务写在了哪一类文件里、语法是否符合该文件的格式。

易错点

  • 「日」与「周」同时限定时是或关系而非与关系,要表达「每月第一个周一」必须把判断写进脚本
  • cron 不支持「每月最后一天」,需在脚本里判断 test "$(date -d tomorrow +%d)" = 01
  • crontab 里 % 有特殊含义(用于分隔命令与标准输入),需要字面量百分号时必须转义成 \%
  • cron 的环境精简且 PATH 很短,命令找不到时不要怀疑脚本,写绝对路径或在 crontab 顶部声明 PATH
  • 任务执行时间可能超过间隔时不用 flock 加锁,会造成任务重叠与资源争用;crontab -r 误删全部任务也没有二次确认

数据来源与参考

  • man 5 crontab
  • cronie 文档:crontab 时间字段与 dom/dow OR 规则

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌