前言
简单的字符串,经过排列组合,总能产生神奇的作用。比如大家耳熟能详的正则表达式,再比如今天要介绍的cron。他们的共同点是简单,但是掌握不好就容易闹笑话。就拿我来说,我想写一个任务,每4个小时执行一次,于是我写下了如下的cron表达式:
* */4 * * *
于是变成了每4小时的每分钟执行一次,也就是每4小时执行60次,如果这个任务比较吃性能,获取还能收获卡死服务器的效果。言归正传,今天来介绍一下cron的语法。在介绍语法之前,先推荐一个网站,https://crontab.guru/, 可以把表达式转换成人类的语言,对于不太熟悉cron的同学来说可以先用这个校验一下,避免犯我这样的错误。
整体
首先要说明的是,根据cron的实现不同,语法上也是有区别的,比如有的实现了秒,有的,
和-
可以一起用。以下的结构来自维基百科:
# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │ 7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * *
由上面可知,一个cron表达式由5个部分组成:分,时,一个月的第几天,月,一周的第几天。这里解释一下前面两个天的区别,前面的表示第几号,后面的表示周几。那么每一部分可以取哪些值呢?
- 分 0-59 *
- 时 0-23 *
- 日 1-31 *
- 月 1-12 *
- 周 0-6 *
但是光靠上面的值,还是不够,举个例子,如果我们想写个每分钟都执行的任务,那么可以这么写:
* * * * *
但是如果要隔5分钟执行一次,就需要新的语法了
隔几分 ---- /
一个/
简单的表达了隔的意思,借助这个符号,我们就可以描述上面的问题了:
*/5 * * * *
但是如果我只是想在20-30分这段时间执行任务呢,那就有请-
从...到... ---- ‘-’
20-30 * * * * 每小时的20-30分执行
30 * * * * 仅在每小时30分执行一次
20-30/2 * * * * 20-30分钟这段时间,每两分钟执行一次
某些 --- ‘,’
正如-
经常表示连续的,,
经常被用来表示离散的,比如在2,3,5,7,11分钟做某项任务,可以这么写:
2,3,5,7,11 * * * *
,
和-
,/
也可以一起使用:
2,5-13/4 4 * * * 在第2分钟,第5-13分钟执行一次
2-30/7,5-13/4 * * * * 在第2-30分每隔7分钟, 5-13每分钟执行一次
有了-
,/
,,
这3个符号,我们就可以灵活描述任何复杂的任务了。
缩写语法
月份,周也可以使用缩写语法;
5 0 * JAN-JUL MON-THU At 00:05 on every day-of-week from Monday through Thursday in every month from January through July
本文完