什么是 Cron 表达式
Cron 表达式是一种用于配置定时任务调度的字符串格式,广泛应用于 Linux crontab、CI/CD 流水线、Node.js 定时任务和分布式任务调度系统。
一个标准的 Cron 表达式由 5 个时间字段组成:
┌───────────── 分钟 (0-59)
│ ┌───────────── 小时 (0-23)
│ │ ┌───────────── 日期 (1-31)
│ │ │ ┌───────────── 月份 (1-12)
│ │ │ │ ┌───────────── 星期 (0-7, 0和7都是周日)
│ │ │ │ │
* * * * *
为什么需要 Cron 表达式解析器
- 定时任务配置:服务器备份、数据同步、报表生成
- CI/CD 调度:定时构建、定时部署
- 监控告警:定期健康检查
- 数据处理:ETL 任务、日志轮转
- 理解复杂表达式:可视化下一次执行时间
Cron 字段语法
特殊字符
| 字符 | 含义 | 示例 |
|------|------|------|
| * | 任意值 | * * * * * = 每分钟 |
| , | 列表 | 1,3,5 * * * * = 第1、3、5分钟 |
| - | 范围 | 1-5 * * * * = 第1到5分钟 |
| / | 步长 | */15 * * * * = 每15分钟 |
常见 Cron 表达式
| 表达式 | 含义 |
|--------|------|
| * * * * * | 每分钟 |
| 0 * * * * | 每小时整点 |
| 0 0 * * * | 每天午夜 0:00 |
| 0 9 * * 1-5 | 工作日上午 9:00 |
| 0 0 1 * * | 每月1日午夜 |
| 0 0 * * 0 | 每周日午夜 |
| */5 * * * * | 每5分钟 |
| 0 */2 * * * | 每2小时 |
| 30 8 * * 1 | 每周一上午 8:30 |
| 0 0 1,15 * * | 每月1日和15日午夜 |
如何使用在线 Cron 解析器
使用 DevToolkit Pro 的 Cron 表达式解析器:
- 输入 Cron 表达式(如
*/15 * * * *) - 工具解析每个字段的含义
- 显示人类可读的描述(如"每 15 分钟")
- 列出最近 5-10 次执行时间
- 支持语法错误检测
代码中的 Cron 使用
Node.js
const cron = require('node-cron');
// 每5分钟执行一次
cron.schedule('*/5 * * * *', () => {
console.log('运行健康检查');
});
// 每天凌晨2点执行数据备份
cron.schedule('0 2 * * *', () => {
console.log('执行数据备份');
});
Python
from crontab import CronTab
# 解析 Cron 表达式
cron = CronTab('* * * * *')
print(cron.description()) # "Every minute"
# 获取下一次执行时间
from datetime import datetime
next_run = cron.get_next(datetime)
Go
import "github.com/robfig/cron/v3"
c := cron.New()
// 每5分钟
c.AddFunc("*/5 * * * *", func() {
fmt.Println("运行健康检查")
})
c.Start()
注意事项
时区问题
Cron 表达式默认使用服务器本地时区。在分布式系统中,建议统一使用 UTC:
# UTC 时间
0 2 * * * # 每天 UTC 02:00
周日表示
不同系统中周日的表示可能不同:
0= 周日(大多数系统)7= 周日(部分系统)1= 周一
最小粒度
标准 Cron 的最小粒度是分钟。如果需要秒级调度,使用扩展 Cron 语法(如 */5 * * * * *,6 个字段)。
FAQ
Cron 表达式和 crontab 是什么关系?
Cron 表达式是调度规则的字符串表示。crontab 是 Linux 中配置定时任务的文件/命令。你将 Cron 表达式写入 crontab 文件来配置定时任务。
*/15 * * * * 和 0,15,30,45 * * * * 一样吗?
效果相同,都是每 15 分钟执行。*/15 是步长语法的简写形式。
如何设置每周一到周五执行?
使用 * * * * 1-5。星期字段中 1=周一,5=周五,0 或 7=周日。
本文由 DevToolkit Pro 提供。更多开发者工具请访问 首页。