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守护进程(crond)在后台持续运行。每分钟它读取crontab文件(每个用户一个,加上/etc/cron.d/中的系统级crontab)并执行任何调度时间与当前时间匹配的作业。每个用户使用crontab命令管理自己的crontab。
/dev/null或日志文件以抑制输出)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
根据平台不同,您会遇到两种常见的Cron格式:
Unix/Linux上crontab使用的经典格式。最小单位是分钟。
# 分钟 小时 月份中的日期 月份 星期几
* * * * *
由Quartz Scheduler(Java)、Spring @Scheduled、AWS EventBridge以及许多CI/CD工具使用。在开头添加了额外的秒字段,末尾可以附加可选的年份字段。
# 秒 分钟 小时 月份中的日期 月份 星期几 [年份]
0 30 9 * * ?
Quartz还引入了标准Cron中没有的额外特殊字符:
? — 无特定值;当另一个字段已指定时,在月份中的日期或星期几中使用(您不能同时将两者设置为非通配符值——对您想忽略的字段使用?)L — 最后:月份中的日期字段中的L表示该月最后一天;星期几字段中的5L表示该月最后一个周五W — 最近的工作日:15W表示距15日最近的工作日# — 月份中第N个星期几:2#1表示该月第一个周一# 标准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实现支持简写字符串作为五字段语法的替代:
@yearly(或@annually)— 每年运行一次:0 0 1 1 *@monthly — 每月运行一次:0 0 1 * *@weekly — 每周运行一次:0 0 * * 0@daily(或@midnight)— 每天运行一次:0 0 * * *@hourly — 每小时运行一次:0 * * * *@reboot — 启动时运行一次# 在默认编辑器中编辑crontab
crontab -e
# 列出当前crontab
crontab -l
# 完全删除crontab
crontab -r
# 编辑其他用户的crontab(仅root)
crontab -u username -e
PATH的最小化环境中运行command >> /var/log/job.log 2>&1flock或锁文件crontab -r时要小心——它在不确认的情况下删除整个crontabCron是Unix和Linux操作系统中基于时间的任务调度器。它允许用户在指定的时间、日期或间隔自动运行命令或脚本。名称来源于希腊语单词chronos,意为时间。
Cron作业是使用Cron守护进程在定义的时间或间隔自动运行的任务。每个Cron作业是crontab文件中的一行,由Cron表达式(5个时间字段)后跟要执行的命令组成。
Cron表达式是由五个空格分隔字段组成的字符串,用于定义调度:分钟(0–59)、小时(0–23)、月份中的日期(1–31)、月份(1–12)和星期几(0–7)。每个字段接受特定值、范围(1-5)、步进值(*/5)和通配符(*)。
星号(*)表示"每个"——它匹配该字段的每个有效值。* * * * *每分钟运行。0 * * * *在每小时的第0分钟运行(即每整点)。
Cron是读取调度并运行作业的守护进程(后台服务)。Crontab(Cron表)是存储已调度作业列表的配置文件。您使用crontab -e编辑crontab,Cron守护进程读取它以了解何时运行每个作业。
使用步进语法:*/5 * * * * /path/to/command。*/5表示"在第0、5、10、15……55分钟"。类似地,*/10表示每10分钟,*/15表示每15分钟。