什么是Cron?

文章

Cron 是内置于Unix和Linux操作系统中的基于时间的任务调度器。它允许您将命令或脚本设置为在固定时间、日期或间隔自动运行——无需任何手动干预。名称来源于希腊语单词 chronos(时间)。Cron是自动执行重复性系统任务(如备份、日志轮转、报告生成和发送电子邮件)的标准工具。

需要构建或验证Cron表达式?

打开Cron构建器 →

历史

最初的Cron由贝尔实验室的Ken Thompson于1979年前后作为Unix第7版的一部分编写。它是一个简单的守护进程,每分钟唤醒一次,检查作业表,并运行任何已调度的作业。Paul Vixie于1987–1988年编写的Vixie Cron取代了它,成为大多数Unix系统上的标准实现,并引入了至今仍在使用的熟悉的五字段语法。Vixie Cron(或其后代)是大多数Linux发行版上的默认Cron。现代变体包括Anacron(用于不持续运行的系统)、Fcron,以及在基于systemd的系统上作为替代方案的systemd定时器。

Cron的工作原理

Cron守护进程(crond)在后台持续运行。每分钟它读取crontab文件(每个用户一个,加上/etc/cron.d/中的系统级crontab)并执行任何调度时间与当前时间匹配的作业。每个用户使用crontab命令管理自己的crontab。

Cron表达式语法

Cron表达式由五个空格分隔的字段后跟要运行的命令组成:

┌───────────── 分钟 (0–59)
│ ┌───────────── 小时 (0–23)
│ │ ┌───────────── 月份中的日期 (1–31)
│ │ │ ┌───────────── 月份 (1–12)
│ │ │ │ ┌───────────── 星期几 (0–7, 0和7均为周日)
│ │ │ │ │
* * * * *  要执行的命令

字段值

常见示例

# 每分钟
* * * * * /path/to/script.sh

# 每天午夜
0 0 * * * /path/to/backup.sh

# 每天凌晨3:30
30 3 * * * /path/to/task.sh

# 每周一上午9:00
0 9 * * 1 /path/to/weekly-report.sh

# 每5分钟
*/5 * * * * /path/to/check.sh

# 每小时(第0分钟)
0 * * * * /path/to/hourly.sh

# 每月第一天午夜
0 0 1 * * /path/to/monthly.sh

# 每个工作日(周一至周五)上午8:00
0 8 * * 1-5 /path/to/workday.sh

# 工作日上午9时至下午5时每15分钟
*/15 9-17 * * 1-5 /path/to/poll.sh

# 每天两次(午夜和正午)
0 0,12 * * * /path/to/twice-daily.sh

标准与Quartz Cron格式

根据平台不同,您会遇到两种常见的Cron格式:

标准(Unix/Linux)Cron — 5个字段

Unix/Linux上crontab使用的经典格式。最小单位是分钟。

# 分钟 小时 月份中的日期 月份 星期几
  *     *    *              *    *

Quartz Cron — 6或7个字段

由Quartz Scheduler(Java)、Spring @Scheduled、AWS EventBridge以及许多CI/CD工具使用。在开头添加了额外的秒字段,末尾可以附加可选的年份字段。

# 秒  分钟 小时 月份中的日期 月份 星期几 [年份]
  0   30   9    *              *    ?

Quartz还引入了标准Cron中没有的额外特殊字符:

并排比较

# 标准Cron — 每天09:30
30 9 * * *

# Quartz Cron — 每天09:30:00
0 30 9 * * ?

# 标准Cron — 每周一08:00
0 8 * * 1

# Quartz Cron — 每周一08:00:00
0 0 8 ? * MON

# 标准Cron — 每5分钟
*/5 * * * *

# Quartz Cron — 每5分钟
0 */5 * * * ?

# 仅Quartz — 每月最后一天午夜
0 0 0 L * ?

# 仅Quartz — 每月第一个周一09:00
0 0 9 ? * 2#1

使用哪种格式?

特殊字符串

大多数Cron实现支持简写字符串作为五字段语法的替代:

Crontab命令

# 在默认编辑器中编辑crontab
crontab -e

# 列出当前crontab
crontab -l

# 完全删除crontab
crontab -r

# 编辑其他用户的crontab(仅root)
crontab -u username -e

使用场景

重要规则

常见问题

什么是Cron?

Cron是Unix和Linux操作系统中基于时间的任务调度器。它允许用户在指定的时间、日期或间隔自动运行命令或脚本。名称来源于希腊语单词chronos,意为时间。

什么是Cron作业?

Cron作业是使用Cron守护进程在定义的时间或间隔自动运行的任务。每个Cron作业是crontab文件中的一行,由Cron表达式(5个时间字段)后跟要执行的命令组成。

什么是Cron表达式?

Cron表达式是由五个空格分隔字段组成的字符串,用于定义调度:分钟(0–59)、小时(0–23)、月份中的日期(1–31)、月份(1–12)和星期几(0–7)。每个字段接受特定值、范围(1-5)、步进值(*/5)和通配符(*)。

Cron表达式中*是什么意思?

星号(*)表示"每个"——它匹配该字段的每个有效值。* * * * *每分钟运行。0 * * * *在每小时的第0分钟运行(即每整点)。

Cron与crontab有什么区别?

Cron是读取调度并运行作业的守护进程(后台服务)。Crontab(Cron表)是存储已调度作业列表的配置文件。您使用crontab -e编辑crontab,Cron守护进程读取它以了解何时运行每个作业。

如何每5分钟运行一次Cron作业?

使用步进语法:*/5 * * * * /path/to/command。*/5表示"在第0、5、10、15……55分钟"。类似地,*/10表示每10分钟,*/15表示每15分钟。

相关文章

参考资料