前言

在生活中,我们往往会碰到一些需要重复性执行的任务,执行的时间往往是固定的日期或者周期性的间隔。比如,我们会希望,热水器在晚上七点开始工作,这样回到家就可以洗澡,又或者每个周末自动将闹钟从工作日的早晨八点响铃切换成中午十一点响铃。

在计算机中,这种“定时”的任务有成千上万,我们就需要一些工具来完成作业任务,比如:Cron。


Cron 是什么

Cron 是类 Unix 操作系统上的作业调度程序,用户通过配置文件来设定作业,以固定的时间、日期或者间隔时间来执行。


创建第一个任务

使用以下命令创建作业:

crontab -e

如果您是第一次创建 crontab,系统会要求您选择默认文本编辑器。选择您喜欢的编辑器 [1 – 4] 并按 ENTER 键以使用您选择的文本编辑器打开一个新的 crontab:

新创建的 crontab 中包含了一些有用的注释:

在最后一行,添加上我们的作业任务:

* * * * * echo "Hello Cron at $(date)" >> ~/test.txt

该任务会每一分钟执行一次 echo 指令,并写入 test.txt 文件中,稍等几分钟查看 test.txt 文件,会发现定时任务执行成功:


Cron 表达式

简单的来说,每一个 Cron 任务都是使用 Cron 表达式编写的,包含两部分内容:作业时间+任务命令。任务命令就是平时在命令行环境下可以指定的任意命令或者脚本。而 Cron 时间表达式需要一些额外的解释,才能读懂。

详细的来说,Cron 任务语法由 6 个用空格分隔的参数组成。前 5 个参数描述执行时间(也就是时间表达式),最后一个参数是命令或将由默认 shell 执行的 shell 脚本的完整路径:

[minute] [hour] [day of month] [month] [day of week] [command]

当分钟、小时和月份字段与当前时间匹配,并且至少一个日期字段(每月的某一天或每周的某一天)与当前时间匹配时,Cron 将执行命令。接下来详细讲讲时间表达式的语法。

取值范围

五个参数都有各自的取值范围,比如,分钟参数是 0-59,而星期的参数是 0-6,参考下表:

参数名 取值范围 注释
minute 0-59 分钟数
hour 0-23 小时数
day of month 1-31 月份中的天数
month 1-12 月份
day of week 0-6 星期几

通过以上的参数,可以指定特定的时间节点去指定任务,举例:

时间表达式 解释
0 0 1 1 ? 1 月 1 日的 0 时 0 分
59 6 15 5 ? 5 月 15 日的 6 时 59 分
30 15 ? 9 0 9 月的每个礼拜天的 15 点 30 分
30 19 ? 12 6 12 月的每个礼拜六的 19 点 30 分
23 22 3 11 3 11 月 3 日以及每个星期三的 22 点 23 分

特殊参数

除了指定特定时间点之外,还可以指定范围,间隔步长,特定取值等等。


Cron 的命令