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,星期二为2。0或7都可以表示星期日。通过数字或星期名称的前三个大写字母(例如,SUN表示星期日)指定星期几。- 此字段与
day of the month字段一起被评估为包含性OR,除非其中一个字段被星号 (*) 标记为不受限制。例如,如果日期设置为1,星期几设置为SAT,则作业会在每月的第一天以及每月的每个星期六运行,即使每月的第一天不是星期六也是如此。如果星期几不受限制(设置为*),则作业仅在每月的第一天运行。
- 此字段与
匹配所有值
如需匹配某个字段的所有值,请使用星号:*。如果某个字段设置为星号,则只要满足其他字段条件,该字段就会匹配该字段的所有有效值。将字段设置为星号有时称为使字段不受限制,因为它不限于特定值。
以下是两个未限制分钟字段的示例:
* 0 1 1 1:作业在 1 月 1 日和星期一的午夜时段每分钟运行一次。* * * * *:作业每分钟运行一次(每小时、每月每天、每月、每周每天,因为这些字段也都不受限制)。
星号等效于范围的特殊情况,其中范围从字段的第一个有效值开始,到字段的最后一个有效值结束(例如,分钟字段的 0-59)。
匹配范围
如需匹配一系列值,请指定起始值和结束值,并用连字符 (-) 分隔。请勿在范围中包含空格。范围包含边界值。第一个数字必须小于第二个数字。如果您使用的是月份或工作日的缩写名称(例如,使用 JAN 而不是 1 表示一年的第一个月),则第一个值在月份或星期中的顺序必须早于第二个值。
以下等效示例在星期一、星期二、星期三、星期四和星期五(所有月份)的午夜运行:
0 0 * * 1-50 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)运行。 |
| 每个工作日 (周一至周五) |
下面两个表达式是对等的:
|
在星期一、星期二、星期三、星期四和星期五的凌晨 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),以完全避免此问题。
其他作业格式
您可以使用更易于阅读的时间规范格式(称为 groc),该格式可替代 cron 表达式。例如,某些周期性活动可能不方便使用 cron 指定,例如“每月第三个星期二”或“每两周”(每 336 小时)。在这种情况下,您可以改用如下示例中的结构:
03 of month 12:34
1,3,4,7,11,18,29 of jan,jul 12:34
1st friday of quarter 9:00
1st,third monday of month 04:00
2nd,3rd tue,wed,thu of feb,aug 13:50
every 336 hours
every 48 hours
every 5 minutes
every 60 minutes on mon,wed
every day 09:00
every minute
every sun,tue,thu 9:00
every wed of december 00:00
first sunday of month 12:00
second,4th tue,thursday of 3rd month of quarter 18:30
使用 groc 指定作业时间表时,您必须使用 gcloud CLI 或直接向 Cloud Scheduler API 发出请求。
如需详细了解语法,请参阅定义 cron 作业时间表。