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(或 JAN 到 DEC) |
周几 | 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
。0
或7
都可以表示星期日。您可以通过数字或星期名称的前三个字母(大写)来指定星期几(例如,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 * * *
:作业每 2 小时运行一次,在整点运行。首次运行时间为午夜。最后一次运行时间为中午。
示例时间表
下表显示了一些示例 cron 作业时间表及其说明:
时间表 | Cron 作业格式 | 说明 |
---|---|---|
每分钟 | * * * * * |
每分钟运行一次。例如,上午 9:00、9:01、9:02 等。 |
每小时 | 0 * * * * |
每小时运行一次。例如,上午 9:00、上午 10:00、上午 11:00 等。 |
每天 | 0 0 * * * |
每天凌晨 12:00(以 24 小时制表示为 00:00)运行。 |
每个工作日 (周一至周五) |
以下表达式是等效的:
|
在星期一、星期二、星期三、星期四和星期五凌晨 12:00(以 24 小时制表示为 00:00)运行。 |
每周 | 以下表达式是等效的:
|
在星期日凌晨 12:00(24 小时制为 00:00)运行。 |
每月 | 0 0 1 * * |
在每月第一天的凌晨 12:00(24 小时制为 00:00)运行。 |
每季度 | 以下表达式是等效的:
|
对于标准的季度时间表,在季度第一天凌晨 12:00(24 小时制为 00:00)运行:1 月 1 日、4 月 1 日、7 月 1 日和 10 月 1 日。 |
每年 | 以下表达式是等效的:
|
在每年第一个月的第一天(1 月 1 日)凌晨 12:00(以 24 小时制表示为 00:00)运行。 |
时区
您可以在 Google Cloud 控制台中选择用于评估时间表的时区(在创建作业页面上,从列表中选择时区),也可以在创建作业时通过 gcloud
--time-zone
标志进行选择。
此字段的值必须是 tz 数据库中使用的时区缩写。默认时区为 UTC
。
在某些时区,夏令时可能会导致作业意外运行或不运行。这是因为 Cloud Scheduler 按挂钟时间运行。如果某一时间可能出现两次(例如时钟回拨的情况),而您的作业安排在此时间,则预定作业的执行可能会有异常。
如果您的作业需要非常特定的节奏,则可能需要考虑选择不采用夏令时的时区。具体来说,建议 Cloud Scheduler 使用 UTC,以完全避免该问题。