Cron 表达式是调度重复任务的通用语言。从传统 crontab 迁移到 Serverless 平台时,各平台都有各自的限制和语法差异。本指南涵盖三大主流 Serverless 平台的 Cron 调度配置。
Cron 表达式基础(60 秒速览)
标准 cron 表达式包含 5 个字段:
┌───────────── minute (0-59)
│ ┌───────────── hour (0-23)
│ │ ┌───────────── day of month (1-31)
│ │ │ ┌───────────── month (1-12)
│ │ │ │ ┌───────────── day of week (0-6, Sun=0)
│ │ │ │ │
* * * * *常用特殊字符:
*— 任意值*/5— 每 5 个单位(步进)1,3,5— 指定值(列表)1-5— 值范围
平台 1:GitHub Actions
GitHub Actions 使用 schedule 事件,采用标准 5 字段 cron 语法。定时工作流仅在默认分支运行。
配置
# .github/workflows/scheduled.yml
name: Scheduled Job
on:
schedule:
- cron: '30 5 * * 1-5' # Weekdays at 5:30 AM UTC
- cron: '0 12 1 * *' # 1st of every month at noon UTC
jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo "Running scheduled task"关键限制
| 方面 | 详情 |
|---|---|
| 时区 | 仅 UTC |
| 最小间隔 | 每 5 分钟 (*/5 * * * *) |
| 准确性 | 高峰时可能延迟 5-15 分钟 |
| 分支 | 仅默认分支 |
| 停用条件 | 仓库 60 天无活动后自动停用 |
GitHub Actions 常用调度
# Every 5 minutes
- cron: '*/5 * * * *'
# Every hour at minute 0
- cron: '0 * * * *'
# Daily at midnight UTC
- cron: '0 0 * * *'
# Daily at 9 AM Eastern (UTC-5, no DST)
- cron: '0 14 * * *'
# Weekdays at 8 AM UTC
- cron: '0 8 * * 1-5'
# Every Monday and Thursday at 6 PM UTC
- cron: '0 18 * * 1,4'
# First day of every month at midnight
- cron: '0 0 1 * *'Tip: GitHub Actions 定时工作流可能无法准时触发。如需精确控制,建议使用外部调度器的 webhook 触发。
平台 2:Vercel Cron Jobs
Vercel Cron Jobs 按计划触发 Serverless 函数。在 vercel.json 中配置。
配置
// vercel.json
{
"crons": [
{
"path": "/api/daily-report",
"schedule": "0 8 * * *"
},
{
"path": "/api/cleanup",
"schedule": "0 0 * * 0"
}
]
}API 路由
// app/api/daily-report/route.ts
import { NextResponse } from 'next/server';
export async function GET() {
// Your scheduled logic here
await sendDailyReport();
return NextResponse.json({ ok: true });
}
// Vercel recommends setting maxDuration for long tasks
export const maxDuration = 60; // seconds关键限制
| 套餐 | 最小间隔 | 最大 Cron 任务数 | 执行时限 |
|---|---|---|---|
| Hobby (free) | Once per day | 2 | 10s |
| Pro | Once per hour | 40 | 60s (default) |
| Enterprise | Once per minute | 100 | 900s |
Important: Vercel Cron 使用 UTC。Hobby 套餐每天最多一次,像 */5 * * * * 的表达式不会按预期工作。
平台 3:Cloudflare Workers(Cron Triggers)
Cloudflare Workers Cron Triggers 在 wrangler.toml 中配置,在全球边缘运行。
配置
# wrangler.toml
name = "my-worker"
main = "src/index.ts"
[triggers]
crons = [
"*/5 * * * *", # Every 5 minutes
"0 12 * * 1-5", # Weekdays at noon UTC
"0 0 1 * *" # First of every month
]Worker 代码
// src/index.ts
export default {
async scheduled(
controller: ScheduledController,
env: Env,
ctx: ExecutionContext
) {
// controller.cron contains the cron pattern that triggered
switch (controller.cron) {
case '*/5 * * * *':
await doHealthCheck(env);
break;
case '0 12 * * 1-5':
await sendReport(env);
break;
}
},
};关键限制
| 方面 | 详情 |
|---|---|
| 时区 | 仅 UTC |
| 最小间隔 | 每分钟一次 |
| Max cron triggers | 每 Worker 3 个(免费版) |
| CPU 时间 | 10ms(免费)/30s(付费) |
| 准确性 | 非常可靠,边缘执行 |
跨平台对比
| 特性 | GitHub Actions | Vercel Cron | CF Workers |
|---|---|---|---|
| Timezone | UTC | UTC | UTC |
| Min interval (free) | 5 min | 1/day | 1 min |
| Min interval (paid) | 5 min | 1/min | 1 min |
| Reliability | Medium (can delay) | High | Very high |
| Max execution time | 6 hours | 10s-900s | 10ms-30s |
| Config location | .github/workflows/ | vercel.json | wrangler.toml |
| Trigger handler | Workflow YAML | API route | scheduled() event |
常见时区陷阱
三个平台都 exclusively 使用 UTC,这是配置 cron 时最常见的 bug 来源。以下是常用时区的 UTC 转换表:
| 本地时间 | UTC 偏移 | Cron(本地 9 点) |
|---|---|---|
| US Eastern (EST) | UTC-5 | 0 14 * * * |
| US Pacific (PST) | UTC-8 | 0 17 * * * |
| Central Europe (CET) | UTC+1 | 0 8 * * * |
| China (CST) | UTC+8 | 0 1 * * * |
| Japan (JST) | UTC+9 | 0 0 * * * |
注意:夏令时会改变 UTC 偏移。EST(UTC-5)在夏季变为 EDT(UTC-4)。Cron 任务不会自动调整。
10 个即用 Cron 表达式
以下是常用调度示例,可直接复制:
# Every 5 minutes
*/5 * * * *
# Every hour at :00
0 * * * *
# Every day at midnight UTC
0 0 * * *
# Every day at noon UTC
0 12 * * *
# Weekdays (Mon-Fri) at 9 AM UTC
0 9 * * 1-5
# Every Monday at 8 AM UTC
0 8 * * 1
# Every 6 hours
0 */6 * * *
# First day of every month at midnight
0 0 1 * *
# Every 15 minutes during business hours (8-17 UTC)
*/15 8-17 * * 1-5
# Last day of month at 11 PM UTC (approximate)
0 23 28-31 * *常见问题
GitHub Actions cron 使用什么时区?
GitHub Actions 始终使用 UTC,无法更改。如需美东 9 点运行,需转换为 UTC(1PM 或 2PM,视夏令时而定)。
Vercel Cron Jobs 的最小间隔是多少?
Hobby(免费):每天 1 次;Pro:每小时 1 次;Enterprise:每分钟 1 次。
Cloudflare Workers Cron 能否每秒运行?
不能。Cloudflare Workers 最小粒度为 1 分钟。如需亚分钟级调度,需使用 Durable Objects 的 alarm() API。