cover
2023年3月19日 - 2023年7月9日

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

picture 1

而如果要清空 crontab 则可以直接使用 crontab -r:

picture 2

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 的定义。

参考链接