Cron 作业格式和时区

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

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(或 1 月到 12 月)
周几 0-6(或 SUN 至 SAT;或 7 表示周日)
  • 分钟:指示作业运行的小时上限后过去了多长时间(以分钟为单位)。例如,如果分钟设置为 0,则作业会在小时的顶点运行(因为此时一小时后 0 分钟)。因此,如果时间是上午 8:00,则作业会在上午 8:00 运行。

  • 小时:指示作业在午夜后运行的小时数(以小时为单位,向下舍入到最接近的小时,因为 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 * * * *:作业在每半小时的前五分钟(在每小时的顶端和半小时的一半)内运行。

跳过某个范围内的值

您可以通过指定逐步浏览该范围的速率来跳过 range 中的值。这有时称为使用步进函数(或步进值或费率表达式)。为此,请指定范围,后跟正斜杠 (/) 和要在此范围内跳过的速率。

您可以使用星号 (*) 来指示字段中所有值的范围。使用星号时,范围中的第一个值是: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 * * * 每天午夜 12:00(格式为 00:00,采用 24 小时制)运行。
每个工作日
(周一至周五)
以下表达式是等效的:
  • 0 0 * * 1-5
  • 0 0 * * MON-FRI
在周一、周二、周三、周四和周五凌晨 12:00(24 小时制:00:00)运行。
每周 以下表达式是等效的:
  • 0 0 * * 0
  • 0 0 * * 7
  • 0 0 * * SUN
每周日午夜 12:00 运行(采用 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 *
在季度第一天的凌晨 12:00(采用 00:00,采用 24 小时制)运行,采用标准的每季度时间表:1 月 1 日、4 月 1 日、7 月 1 日和 10 月 1 日。
每年 以下表达式是等效的:
  • 0 0 1 1 *
  • 0 0 1 JAN *
在每年第一个月第一天(1 月 1 日)的凌晨 12:00(采用 24 小时制的 00:00)运行。

时区

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

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

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