2026-04-11
Cron 表达式详解:像专家一样调度任务
从基础模式到高级调度,掌握 cron 语法。解析、调试和创建 cron 表达式,用于 Linux、Kubernetes 和 CI/CD。
Cron运维Linux
什么是 Cron 表达式?
Cron 表达式是一种紧凑的字符串,用于定义周期性任务的调度。源自 Unix 的 cron 守护进程,这种格式已成为调度的通用标准——用于 Linux crontab、Kubernetes CronJob、CI/CD 流水线和云函数。
标准 cron 表达式有五个字段:分钟 小时 日 月 星期。我们的 Cron 解析器 将任何 cron 表达式翻译为通俗易懂的中文,并显示未来的执行时间。
Cron 表达式语法
┌───────────── 分钟 (0–59)
│ ┌───────────── 小时 (0–23)
│ │ ┌───────────── 日 (1–31)
│ │ │ ┌───────────── 月 (1–12)
│ │ │ │ ┌───────────── 星期 (0–7, 0 和 7 = 周日)
│ │ │ │ │
* * * * *
特殊字符
*— 任意值(每分钟、每小时等),— 值列表:1,3,5-— 范围:1-5(周一到周五)/— 步长:*/15(每 15 个单位)
常用 Cron 模式
以下是你最常用的表达式:
*/5 * * * * 每 5 分钟
0 * * * * 每小时整点
0 9 * * * 每天上午 9:00
0 9 * * 1-5 工作日上午 9:00
0 0 1 * * 每月 1 日午夜
0 0 * * 0 每周日午夜
30 6,18 * * * 每天上午 6:30 和下午 6:30
0 */2 * * * 每 2 小时
Cron 实际应用
Linux Crontab
使用 crontab -e 编辑你的 crontab,每行添加一个表达式:
# 每天凌晨 3:00 运行备份脚本
0 3 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1
# 每周日凌晨 2:00 清理临时文件
0 2 * * 0 find /tmp -type f -mtime +7 -delete
# 每 5 分钟发送健康检查
*/5 * * * * curl -sf https://api.example.com/health || echo "Down!" | mail -s "Alert" [email protected]
Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
name: data-sync
spec:
schedule: "0 */6 * * *" # 每 6 小时
jobTemplate:
spec:
template:
spec:
containers:
- name: sync
image: data-sync:latest
restartPolicy: OnFailure
GitHub Actions
# .github/workflows/cleanup.yml
name: Cleanup
on:
schedule:
- cron: '0 0 * * 0' # 每周日
jobs:
clean:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: ./scripts/cleanup.sh
扩展 Cron:6 位和 7 位格式
有些系统将 cron 扩展为 6 位或 7 位,增加秒和/或年:
标准 (5 位): 0 9 * * *
含秒: 0 0 9 * * * (Spring, Quartz)
含年: 0 0 9 * * * 2026 (Quartz 调度器)
我们的 Cron 解析器 支持标准和扩展格式。
时区注意事项
标准 cron 使用系统本地时区。对于云服务,务必确认时区上下文:
- Linux crontab:使用
TZ环境变量或系统时区 - AWS CloudWatch Events:始终为 UTC
- Google Cloud Scheduler:每个任务可配置
- Kubernetes:使用 kube-controller-manager 的时区
调试 Cron 表达式
最常见的 cron 错误:
- 星期编号错误:有些系统 0=周日,有些 1=周一。检查你的平台。
- 缺少环境变量:Cron 使用最小化 PATH 运行。始终在命令中使用绝对路径。
- 静默失败:将输出重定向到日志文件,否则你永远不会知道任务是否运行(或失败)。
# 错误: cron 找不到命令
0 9 * * * my-script.sh
# 正确: 绝对路径和日志
0 9 * * * /usr/local/bin/my-script.sh >> /var/log/my-script.log 2>&1
常见问题
如何每 30 秒运行一次 cron 任务?
做不到——cron 的最小粒度是 1 分钟。对于亚分钟调度,在脚本中使用循环、systemd 定时器或专用调度器。
0 和 7 表示周日有什么区别?
在标准 cron 中两者都表示周日。随便用哪个,0 更常见。
能否不等待就测试 cron 表达式?
当然!使用我们的 Cron 解析器 即时查看接下来 N 次执行时间。无需等待。
为什么我的 cron 任务没运行?
检查:脚本文件权限是否正确、命令是否使用绝对路径、磁盘空间是否充足、cron 守护进程是否在运行(systemctl status cron)。
总结
Cron 表达式是任务调度的通用语言。掌握五字段语法,学习常用模式,你就能处理从备份脚本到 CI/CD 流水线的一切任务。使用我们的 Cron 解析器 可视化和验证任何 cron 表达式,获取通俗易懂的描述和即将执行的时间。
试试这个工具?
打开工具 →