Cron 作业格式和时区

Cron 作业按周期性间隔进行安排,使用基于 unix-cron 的格式指定。您可以定义时间表,以便让您的作业每天运行多次,或在特定的日期和月份运行。(虽然我们不再建议使用此方法,但对于现有作业,仍支持通过创建 cron.yaml 文件来调度作业。)

Cloud Scheduler 还支持使用更易于理解的格式来安排作业。如需了解详情,请参阅本文档中的替代作业格式

Cron 作业格式

您可以使用 Google Cloud 控制台、Google Cloud CLI 或 Cloud Scheduler REST API 来设置时间表。

时间表使用 unix-cron 字符串格式 (* * * * *) 进行定义,该格式是一行中五个字段的集合,指示应何时执行作业。

时间字段具有以下格式和可能值,并且必须遵循此顺序:

|------------------------------- Minute (0-59)
|     |------------------------- Hour (0-23)
|     |     |------------------- Day of the month (1-31)
|     |     |     |------------- Month (1-12; or JAN to DEC)
|     |     |     |     |------- Day of the week (0-6; or SUN to SAT; or 7 for Sunday)
|     |     |     |     |
|     |     |     |     |
*     *     *     *     *
字段 有效值的范围
分钟 0-59
小时 0-23
日期 1-31
1-12(或 JAN 到 DEC)
周几 0-6(或 SUN 至 SAT;或 7 表示周日)
  • 分钟:表示作业在整点后运行的时间(以分钟为单位)。例如,如果将分钟设置为 0,则作业会在整点运行(因为这是小时后的 0 分钟)。因此,如果时间为上午 8:00,作业会在上午 8:00 运行。

  • 小时:表示作业在午夜之后运行的小时数(向下舍入到最接近的小时数,因为剩余分钟数在 minute 字段中表示)。午夜为 0,中午为 12。例如,如果将小时设置为 0,则作业会在午夜时运行(因为这是午夜后 0 小时)。

  • 日期:表示月份中的日历日期。例如,1 表示当月的第一天。Cloud Scheduler 不支持使用 L 表示当月的最后一天。

  • 月份:表示月份。指定月份编号或月份名称的前三个大写字母。例如,1 表示 1 月,也可以表示为 JAN

  • 星期几:表示星期几。例如,星期一为 1,星期二为 207均可表示星期日。通过数字或星期名称的前三个大写字母(例如 SUN 表示星期日)指定星期几。

    • 此字段与 day of the month 字段一起评估为包含性 OR,除非其中一个字段被星号 (*) 标记为不受限。例如,如果将日期设置为 1,并将周几设置为 SAT,则作业会在每月的第一天每月的每个星期六运行,即使每月的第一天不是星期六也是如此。如果星期几不受限制(设置为 *),则作业仅在每月的第一天运行。

匹配所有值

如需匹配某个字段的所有值,请使用星号:*。如果某个字段设置为星号,则只要满足其他字段条件,该字段就会匹配相应字段的所有有效值。将字段设置为星号有时称为将字段留为不受限,因为该字段不受特定值的限制。

以下是两个分钟字段不受限制的示例:

  • * 0 1 1 1:作业在 1 月 1 日和星期一的午夜时分每分钟运行一次。
  • * * * * *:作业每分钟运行一次(每月每天每小时的每分钟,每周每天,因为这些字段也都不受限制)。

星号相当于一种特殊情况的范围,其中范围从字段的第一个有效值开始,到字段的最后一个有效值结束(例如,分钟字段的范围为 0-59)。

匹配范围

如需匹配某个范围内的值,请指定起始值和结束值,并用连字符 (-) 分隔。请勿在范围内添加空格。范围包含边界值。第一个数字必须小于第二个数字。如果您使用月份或工作日的缩写名称(例如,JAN 而不是 1 表示一年中的第一个月),则第一个值必须在月份或周中早于第二个值。

以下等效示例会在周一、周二、周三、周四和周五(所有月份)的午夜运行:

  • 0 0 * * 1-5
  • 0 0 * * MON-FRI

匹配列表

列表可以包含相应字段的任何有效值,包括范围。 指定您的值,并以英文逗号 (,) 分隔。请勿在列表中添加空格。

示例:

  • 0 0,12 * * *:作业在午夜和中午运行。
  • 0-5,30-35 * * * *:作业在每半小时的前五分钟(整点和半点)运行。

跳过范围中的值

您可以指定在范围内跳过值的速率,从而跳过范围中的值。这有时称为使用阶跃函数(或阶跃速率表达式)。为此,请指定范围,然后指定正斜杠 (/) 和您希望跳过该范围的速率。

您可以使用星号 (*) 来表示相应字段的所有值范围。 使用星号时,范围中的第一个值如下:分钟、小时和星期几(星期日)字段为 0,日期和月份字段为 1。

步进值不能大于相应字段的最大可能值。 默认步长为 1,因此步长函数 /1 与完全不使用步长函数相同。

使用阶跃函数的范围示例:

  • */2:这是任何字段的有效步进函数。对于分钟字段,它匹配 0、2、4、...、58。对于小时,它与 0、2、4、...、22 相匹配。对于月份中的某天,它匹配 1、3、5、...、31(对于有 31 天的月份)。对于月份,它匹配 1、3、5、...、11。对于星期几,它匹配 0、2、4、6。

  • 0-12/2:这是分钟和小时字段的有效步进函数。它与 0、2、4、...、12 相匹配。

使用阶跃函数的示例时间表:

  • */2 * * * *:作业每两分钟运行一次。

  • 0 0-12/2 * * *:作业每两小时运行一次,在整点运行。首次运行时间为午夜。最后一班车在中午。

示例时间表

下表显示了一些示例 cron 作业时间表及其说明:

时间表 Cron 作业格式 说明
每分钟 * * * * * 在每分钟的开始时刻运行。例如,上午 9:00、上午 9:01、上午 9:02 等。
每小时 0 * * * * 每小时运行一次。例如,上午 9:00、上午 10:00、上午 11:00 等。
每天 0 0 * * * 每天凌晨 12:00(采用 24 小时制时为 00:00)运行。
每个工作日
(周一至周五)
以下表达式是等效的:
  • 0 0 * * 1-5
  • 0 0 * * MON-FRI
在周一、周二、周三、周四和周五的 00:00(24 小时制)运行。
每周 以下表达式是等效的:
  • 0 0 * * 0
  • 0 0 * * 7
  • 0 0 * * SUN
在周日 12:00 AM(以 24 小时制表示为 00:00)运行。
每月 0 0 1 * * 在每个月的第一天凌晨 12:00(24 小时制为 00:00)运行。
每季度 以下表达式是等效的:
  • 0 0 1 1,4,7,10 *
  • 0 0 1 JAN,APR,JUL,OCT *
在每个季度的第一天(即 1 月 1 日、4 月 1 日、7 月 1 日和 10 月 1 日)的 00:00(以 24 小时制表示)运行一次,以实现标准的季度性安排。
每年 以下表达式是等效的:
  • 0 0 1 1 *
  • 0 0 1 JAN *
在每年第一个月(1 月 1 日)的第一天凌晨 12:00(以 24 小时制表示为 00:00)运行。

时区

您可以在Google Cloud 控制台中选择用于评估时间表的时区(在创建作业页面上,从列表中选择时区),也可以在创建作业时通过 gcloud --time-zone 标志选择时区。

此字段的值必须是 tz 数据库中使用的时区缩写。 默认时区为 UTC

在某些时区,夏令时可能会导致作业意外运行或不运行。这是因为 Cloud Scheduler 按挂钟时间运行。如果某一时间可能出现两次(例如时钟回拨的情况),而您的作业安排在此时间,则预定作业的执行可能会有异常。

如果您的作业需要非常特定的节奏,则可能需要考虑选择不采用夏令时的时区。具体来说,建议 Cloud Scheduler 使用 UTC,以完全避免该问题。

其他作业格式

您可以使用一种更易于理解的时间规范格式(称为 groc),它可替代 cron 表达式。

请注意,使用 groc 指定作业调度时,您必须使用 gcloud CLI 或直接向 Cloud Scheduler API 发出请求。

例如,有些周期性活动可能很难使用 cron 来指定,例如“每个月的第三个星期二”。在这种情况下,您可以改用如下示例所示的构造:

first sunday of month 12:00
2nd,3rd tue,wed,thu of feb,aug 13:50
every wed of december 00:00
1st friday of quarter 9:00
second,4th tue,thursday of 3rd month of quarter 18:30
1,3,4,7,11,18,29 of jan,jul 12:34
03 of month 12:34
every day 09:00
every sun,tue,thu 9:00
every 48 hours
every 5 minutes
every 60 minutes on mon,wed
every minute

如需详细了解语法,请参阅定义 Cron 作业时间表

后续步骤