crontab
crontab 时 linux 中用于定期执行程序的一个命令,由于其定时格式简单易懂、表达力强、使用较为广泛,被应用于各种定时任务中,比如各种 CI/CD 中的定时任务、青龙脚本中的定时规则。
crontab 格式
crontab 一般为 5 位,分别表示 minute hour day(month) month day(week)
,也有一部分平台支持 6 位格式,即在第一位添加上 second
,不过由于定时任务时间精度问题,意义不大,并且一般可以省略。
字段定义
其每个字段具体定义及范围如下:
- second: 秒,范围为 0-59
- minute:分钟,范围为 0-59
- hour:小时,24 小时制,范围为 0-23
- day(month):日期,范围为 1-31
- month:月份,范围为 1-12
- day(week):星期几,范围为 0-6,0 为星期天
一般数字用于表示精确值,比如 0 10 1 * *
表示每月 1 日的 10 点会执行任务。
字段定义格式
此外每个字段还会支持一些特定的字符以帮助更方便的定义任务。
*
在 crontab 中最常见的就是 *
,用于表示通配符。比如 * * * * *
即表示每分钟都会执行任务,* 1 * * *
则表示每天的 1 点的每个分钟都会执行任务。
-
而 -
则用做范围连接符。比如 1-10 * * * *
则表示每个小时的 1 分到 10 分每分钟都会执行任务,而 1 * * * 1-2
则表示每周一、周二的每个小时的 1 分都会执行任务。
此外还要注意此处的连接符是不限制前后的大小顺序的,比如 18-2
小时表示的是从 18 到 2 点(18, 19, 20, ..., 0, 1, 2)。
,
,
用于做连接符,将多个特定值进行连接,可以理解为定义数组。比如 5,15 * * * *
表示每小时的 5 分和 15 分会执行任务,* * * * 1,3,5
则表示每周的周一、周三、周五每分钟都会执行任务。
/
/
一般需要搭配 -
进行使用,表示的时范围值的 step
,即步进数量。 比如 0-30/3 * * * *
表示的是每个小时的 0-30 分钟里,每隔 3 分钟(0, 3, 6, 9, ...., 30)任务就会执行一次。
L
除了上面几个通用的符号外,还有较为特殊的 L
,它一般被用在月份中,代表的是每个月的最后一天(Last),主要是为了解决每个月份天数不一致的问题。比如 0 22 L * *
表示每个月的最后一天(在 1 月就是 31 日,在 2 月就可能是 28 或 29 日)的 22 点执行任务。
特殊值
除了上面使用通用的一个格式来定义定时任务外,一些特殊的引擎还支持一些非标准的特殊定时任务格式,比如:
- @monthly:每个月的 1 日 0 点 0 分执行任务
- @weekly:每周的周一 0 点 0 分执行任务
- @reboot:每次重启后执行任务
linux 中的 crontab 命令
一般在 linux 中使用 crontab 时,我们需要使用 crontab -e 来打开定义文件(注意先安装 crontab),打开后我们可以在其中添加我们的任务,比如:
* * * * * touch ~/test.txt
保存文件后 crontab 就会按照当前文件开始定时执行,此时上述文件会每分钟在主目录下创建 test.txt
文件。
如果要查看当前的 crontab 定义则可以使用 crontab -l
:
而如果要清空 crontab 则可以直接使用 crontab -r
:
crontab [-u user] file
此外还可以指定 crontab 文件的位置,比如 crontab filename
,也可以为指定用户指定 crontab -u user filename
。
crontab [-u user] [ -e | -l | -r ]
当然,上述的 -e、-l、-r 也可以指定用户来执行。
工具
crontab 如果格式记不住也可以借助一些在线工具,比如:https://crontab.guru/ 或 https://tool.lu/crontab/ ,可以在线编辑和看到 crontab 的定义。