alltools.one
DevOps
2026-02-25
11 min
alltools.one Team
cronschedulingdevopsautomationlinux

Cron 表达式速查表 — 像专家一样调度任务

Cron 是 Unix 类系统中计划任务自动化的基石。无论是日志轮换、数据库备份还是触发 CI/CD 流水线,cron 表达式定义了这些任务何时执行。语法简洁但强大——如果靠猜测很容易出错。

本参考涵盖了 cron 语法的每个部分,并附有实用的可复制粘贴的示例。如果你想交互式地构建和验证表达式,请在阅读本指南的同时打开 Cron 表达式构建器

Cron 语法:五个字段

标准 cron 表达式由空格分隔的五个字段组成:

┌───────────── 分钟 (0–59)
│ ┌───────────── 小时 (0–23)
│ │ ┌───────────── 日 (1–31)
│ │ │ ┌───────────── 月 (1–12)
│ │ │ │ ┌───────────── 星期 (0–7,其中 0 和 7 = 星期日)
│ │ │ │ │
* * * * *

每个字段接受特定值、范围、列表或通配符。五个字段组合在一起指定精确的重复调度。

字段允许值特殊字符
分钟0–59* , - /
小时0–23* , - /
1–31* , - /
1–12* , - /
星期0–7* , - /

月和星期字段在大多数实现中也接受三字母缩写(JANDECSUNSAT)。

特殊字符说明

理解四个特殊字符即可解锁 cron 的全部功能:

星号 * — "每个"

匹配该字段的所有可能值。

* * * * *    # 每天每小时每分钟执行

逗号 , — "和"

指定离散值列表。

0 9,12,18 * * *    # 每天 9:00、12:00 和 18:00 执行

连字符 - — "到"

定义包含范围。

0 9-17 * * *    # 从上午 9 点到下午 5 点每小时执行

斜杠 / — "每第 n 个"

从范围起始设置步进间隔。

*/10 * * * *    # 每 10 分钟(0、10、20、30、40、50)

可以将范围与步进结合:

0 9-17/2 * * *    # 上午 9 点到下午 5 点每 2 小时(9、11、13、15、17)

常用 Cron 调度示例

收藏此表。这些是你会反复使用的调度。

调度表达式说明
每分钟* * * * *每分钟开始时执行
每 5 分钟*/5 * * * *第 0、5、10、15、…、55 分钟
每 15 分钟*/15 * * * *第 0、15、30、45 分钟
每小时0 * * * *每小时第 0 分钟执行
每 6 小时0 */6 * * *00:00、06:00、12:00、18:00
每天午夜0 0 * * *每天一次,00:00 执行
每天凌晨 3 点0 3 * * *每天一次,03:00 执行
每周一上午 9 点0 9 * * 1每周一 09:00 执行
工作日上午 8 点0 8 * * 1-5周一至周五 08:00
周末中午0 12 * * 0,6周六、周日 12:00
每月 1 日0 0 1 * *每月 1 日午夜
每季度(1、4、7、10 月)0 0 1 1,4,7,10 *季度月 1 日午夜
工作时间每 15 分钟*/15 9-17 * * 1-5工作日 9 点–17 点,每 15 分钟

将任何表达式粘贴到 Cron 表达式构建器 中以可视化下次执行时间。

高级模式

组合列表和范围

字段接受混合语法。在工作日上午 8 点和下午 6 点运行任务:

0 8,18 * * 1-5

使用步进指定特定月份:

0 0 1 1-12/3 *    # 从一月开始每 3 个月(1月、4月、7月、10月)

日 vs. 星期

当日和星期都被设置(非 *)时,行为取决于实现。在标准 cron 中,如果任一条件满足,任务就会执行——是 OR 关系,不是 AND。这让很多人措手不及。

0 0 15 * 1    # 在 15 日和每周一执行——不是"15日的周一"

启动时执行

虽然严格来说不是 cron 表达式,但 @reboot 是一个广泛支持的简写:

@reboot /usr/local/bin/start-service.sh

其他常见简写:

简写等效表达式
@yearly0 0 1 1 *
@monthly0 0 1 * *
@weekly0 0 * * 0
@daily0 0 * * *
@hourly0 * * * *

不同环境中的 Cron

五字段语法是通用的,但配置 cron 的方式因平台而异。

Linux Crontab

经典方式。使用 crontab -e 编辑用户 crontab:

# 每天凌晨 2 点运行备份
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1

/etc/cron.d/ 中的系统级 cron 任务包含额外的用户字段:

0 2 * * * root /usr/local/bin/cleanup.sh

GitHub Actions

GitHub Actions 在 schedule 触发器中使用相同的五字段语法。所有时间为 UTC。

on:
  schedule:
    - cron: '0 3 * * 1-5'   # 工作日 UTC 凌晨 3 点

有关 YAML 配置的深入了解,请参阅 Kubernetes 的 YAMLDocker Compose 的 YAML

Kubernetes CronJob

Kubernetes 将 cron 表达式封装在 CronJob 资源中:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: nightly-report
spec:
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
            - name: report
              image: reporting:latest
              command: ["python", "generate_report.py"]
          restartPolicy: OnFailure

Kubernetes 默认使用 UTC。从 v1.25 开始,你可以在 CronJob 规范中设置 timeZone: "America/New_York"

AWS CloudWatch (EventBridge)

AWS 使用稍有不同的语法,包含六个字段(添加秒)和 rate() / cron() 包装器:

cron(0 3 * * ? *)    # 每天 UTC 凌晨 3 点

注意 ? 字符——当另一个被指定时,AWS 要求日或星期中的一个使用 ?。这与标准 cron 不同。

常见陷阱

1. 时区混淆

Cron 在 Linux 上默认使用系统时区,但 Kubernetes 和 GitHub Actions 在 UTC 下运行。设置为 0 9 * * * 的任务将在 UTC 上午 9 点触发,即北京时间下午 5 点。

始终验证调度器使用的时区。有关时间戳转换,我们的 Unix 时间戳详解 指南详细介绍了 UTC 偏移。

2. 执行重叠

如果任务耗时超过运行间隔,你将得到重叠的实例。在 */5 * * * * 调度上运行 8 分钟的脚本会堆积。

解决方案:

  • 使用锁文件(Linux 上的 flock
  • 在 Kubernetes CronJob 中设置 concurrencyPolicy: Forbid
  • 在脚本开始时检查正在运行的实例

3. 输出缺失和调试

Cron 默认不捕获 stdout。始终重定向输出:

*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1

如果 cron 任务没有运行,检查:

  • grep CRON /var/log/syslog 查看执行日志
  • 脚本的文件权限
  • PATH 环境变量——cron 默认有一个最小的 PATH

4. "每月 31 日"陷阱

0 0 31 * *    # 仅在有 31 天的月份执行

这在 1 月、3 月、5 月、7 月、8 月、10 月和 12 月执行,但会静默跳过其他五个月。如果需要月末任务,考虑在 1 日运行并调整脚本逻辑,或使用支持"月末"语义的工具。

5. 忘记 Crontab 末尾的换行符

某些 cron 实现要求 crontab 文件末尾有换行符。如果最后一个条目不执行,在末尾添加空行。

可视化构建表达式

记忆语法适用于常见模式,但复杂调度通过可视化方式构建更容易。alltools.one 的 Cron 表达式构建器 让你可以:

  • 通过下拉菜单选择每个字段的值
  • 查看调度的人类可读描述
  • 预览即将到来的执行时间
  • 一键复制最终表达式

完全在浏览器中运行——不会向任何服务器发送数据。

快速参考卡

将此块复制到项目文档或团队 wiki 中:

# ┌───── 分钟 (0-59)
# │ ┌───── 小时 (0-23)
# │ │ ┌───── 日 (1-31)
# │ │ │ ┌───── 月 (1-12)
# │ │ │ │ ┌───── 星期 (0-7,日=0 或 7)
# │ │ │ │ │
# * * * * *

*/5 * * * *        # 每 5 分钟
0 * * * *          # 每小时
0 0 * * *          # 每天午夜
0 9 * * 1-5        # 工作日上午 9 点
0 0 1 * *          # 每月 1 日
*/15 9-17 * * 1-5  # 工作时间每 15 分钟

延伸阅读


准备构建下一个 cron 表达式了吗?打开 Cron 表达式构建器,一次就把调度设置对。

Published on 2026-02-25
Cron Expression Cheat Sheet — Schedule Like a Pro | alltools.one