Cron 作业格式和时区

Cron 作业按周期性间隔进行安排,使用基于 unix-cron 的格式指定。 您可以定义时间表,以便让您的作业每天运行多次,或在特定的日期和月份运行。(尽管我们不再建议使用旧版 App Engine Cron 语法,但现有作业仍支持旧版)。

Cron 作业格式

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

unix-cron 字符串格式

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

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

字段 有效值的范围
分钟 0-59
小时 0-23
日期 1-31
1-12(或 1 月到 12 月)
周几 0-6(或 SUN 到 SAT;7 表示周日)
  • 分钟:指示作业运行的小时上限后过去多长时间(以分钟为单位)。例如,如果分钟设置为 0,则作业会在每小时的点(因为小时后 0 分钟)运行。因此,如果时间是上午 8:00,作业将在上午 8:00 运行。

  • 小时hour 指示作业在午夜后的运行时间,以小时为单位(向下舍入为最接近的小时,因为剩余分钟数会在 minute 字段中指明)。午夜是 0,中午是 12。例如,如果小时设置为 0,则作业将在午夜运行(因为午夜后 0 小时)。

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

  • :表示月份。请以大写形式指定月份编号或月份名称的前三个字母。例如,1 表示 1 月,或等效的 JAN 表示。

  • 星期几:表示星期几。星期一为 1,星期二为 2,以此类推。07 都可以表示星期日。可以通过数字或工作日名称的前三个字母大写来指定星期几(例如,SUN 表示星期日)。

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

匹配所有值

如需匹配字段的所有值,请使用星号 *。当某个字段设置为星号时,只要满足其他字段条件,该字段就会匹配该字段的所有有效值。将某个字段设置为星号有时也称为使该字段保留无限制,因为它不限于特定值。

以下是两个示例,其中分钟字段未限制:

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

星号等同于 range 的特殊情况,其中范围从字段的第一个有效值开始,直至字段的最后一个有效值结束(例如,0-59 表示分钟字段)。

与某个范围匹配

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

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

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

匹配列表

列表可以包含字段的任何有效值,包括 ranges。指定值,并用英文逗号 (,) 分隔。请勿在列表中包含空格。

示例:

  • 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、上午 02 等。
每小时 0 * * * * 整点运行。例如,上午 9:00、上午 10:00、上午 11:00 等。
每天 0 0 * * * 每天午夜 00:00(格式为 24 小时制)运行。
每个工作日
(周一至周五)
以下表达式是等效的:
  • 0 0 * * 1-5
  • 0 0 * * MON-FRI
在周一、周二、周三、周四和周五凌晨 12:00(24 小时制)运行。
每周 以下表达式是等效的:
  • 0 0 * * 0
  • 0 0 * * 7
  • 0 0 * * SUN
每周日午夜 12:00(00:00,采用 24 小时制)运行。
每月 0 0 1 * * 在每月第一天的凌晨 00:00(采用 24 小时制)运行。
每季度 以下表达式是等效的:
  • 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 日)的凌晨 00:00(采用 24 小时制)运行。

时区

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

对于某些时区,夏令时导致作业运行或无法意外运行。这是因为 Cloud Scheduler 是按挂钟时间运行。如果时间可以出现两次(例如时钟向后调慢),并且您的作业安排在此时间,则安排的作业可能会观察到执行异常。

如果您的工作需要非常具体的节奏,则可能需要考虑选择不遵循夏令时的时区。具体而言,建议为 Cloud Scheduler 使用世界协调时间 (UTC),以避免完全出现问题。