Cron 表达式完全指南:从入门到精通
适合人群: Linux 运维工程师、后端开发者、DevOps 工程师 阅读时长: 15 分钟 难度级别: ⭐⭐ 初级到中级
目录
- 什么是 Cron 表达式?
- Cron 表达式的 5 个字段
- 特殊字符详解
- 20+ 个实用示例
- Linux Crontab 使用指南
- Kubernetes CronJob 应用
- 最佳实践和注意事项
- 常见问题 FAQ
什么是 Cron 表达式?
Cron 表达式是一种用于配置定时任务的时间格式,广泛应用于 Linux/Unix 系统、Kubernetes、Spring Boot 等平台。通过简单的字符串,就能精确控制任务的执行时间。
应用场景
- ✅ 数据库备份: 每天凌晨 2 点自动备份数据库
- ✅ 日志清理: 每周日删除 30 天前的日志文件
- ✅ 数据同步: 每 5 分钟同步一次数据
- ✅ 报表生成: 每月 1 号生成上月统计报表
- ✅ 健康检查: 每分钟检查服务状态
标准格式
* * * * *
│ │ │ │ │
│ │ │ │ └─── 星期几 (0-7, 0 和 7 都表示周日)
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日期 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)
Cron 表达式的 5 个字段
1. 分钟 (0-59)
控制任务在每小时的第几分钟执行。
| 表达式 | 含义 |
|---|---|
* | 每分钟 |
0 | 每小时的第 0 分钟(整点) |
15 | 每小时的第 15 分钟 |
*/5 | 每 5 分钟 |
0,30 | 每小时的第 0 和 30 分钟 |
2. 小时 (0-23)
控制任务在每天的第几小时执行(24 小时制)。
| 表达式 | 含义 |
|---|---|
* | 每小时 |
0 | 每天凌晨 0 点 |
2 | 每天凌晨 2 点 |
9-17 | 每天 9:00-17:00 |
*/2 | 每 2 小时 |
3. 日期 (1-31)
控制任务在每月的第几天执行。
| 表达式 | 含义 |
|---|---|
* | 每天 |
1 | 每月 1 号 |
15 | 每月 15 号 |
1,15 | 每月 1 号和 15 号 |
*/7 | 每 7 天 |
4. 月份 (1-12)
控制任务在每年的第几月执行。
| 表达式 | 含义 |
|---|---|
* | 每月 |
1 | 每年 1 月 |
6,12 | 每年 6 月和 12 月 |
1-6 | 每年 1-6 月 |
5. 星期几 (0-7)
控制任务在每周的第几天执行(0 和 7 都表示周日)。
| 表达式 | 含义 |
|---|---|
* | 每天 |
0 或 7 | 每周日 |
1 | 每周一 |
1-5 | 每周一到周五(工作日) |
6,0 | 每周六和周日(周末) |
特殊字符详解
1. 星号 * - 通配符
表示"任意值"或"每个"。
* * * * * # 每分钟执行
0 * * * * # 每小时执行(整点)
0 0 * * * # 每天凌晨执行
2. 逗号 , - 列表
指定多个具体值。
0 8,12,18 * * * # 每天 8:00、12:00、18:00 执行
0 0 1,15 * * # 每月 1 号和 15 号凌晨执行
0 9 * * 1,3,5 # 每周一、三、五 9:00 执行
3. 横杠 - - 区间
指定一个连续范围。
0 9-17 * * * # 每天 9:00-17:00 每小时执行
0 0 * * 1-5 # 每周一到周五凌晨执行
0 0 1-7 * * # 每月 1-7 号凌晨执行
4. 斜杠 / - 间隔
指定间隔频率。
*/5 * * * * # 每 5 分钟执行
0 */2 * * * # 每 2 小时执行
0 0 */3 * * # 每 3 天执行
5. 问号 ? - 不指定
仅在部分系统(如 Quartz)中使用,表示不关心该字段的值。
20+ 个实用示例
基础场景
1. 每分钟执行
* * * * *
# 用途:实时监控、健康检查
2. 每 5 分钟执行
*/5 * * * *
# 用途:数据同步、状态刷新
3. 每小时执行
0 * * * *
# 用途:小时级统计、缓存更新
4. 每天凌晨 2 点执行
0 2 * * *
# 用途:数据库备份、日志归档
5. 每天早上 8 点执行
0 8 * * *
# 用途:每日报表、数据抓取
工作日场景
6. 每周一到周五早上 9 点执行
0 9 * * 1-5
# 用途:工作日自动化任务
7. 工作日每小时执行
0 9-17 * * 1-5
# 用途:工作时间监控
8. 每周五下午 5 点执行
0 17 * * 5
# 用途:周报生成
周末场景
9. 每周日凌晨 3 点执行
0 3 * * 0
# 用途:周末全量备份
10. 周末每 2 小时执行
0 */2 * * 6,0
# 用途:周末降低监控频率
月度场景
11. 每月 1 号凌晨执行
0 0 1 * *
# 用途:月度报表、账单生成
12. 每月最后一天
# Cron 不直接支持"最后一天",需要脚本判断
0 0 28-31 * * [ $(date -d tomorrow +\%d) -eq 1 ] && /path/to/script.sh
13. 每月 15 号中午 12 点
0 12 15 * *
# 用途:中期数据同步
季度/年度场景
14. 每季度第一天
0 0 1 1,4,7,10 *
# 用途:季度统计
15. 每年 1 月 1 日凌晨
0 0 1 1 *
# 用途:年度归档、数据迁移
复杂组合场景
16. 每 30 分钟执行
0,30 * * * *
# 或
*/30 * * * *
17. 每天 8:00、12:00、18:00 执行
0 8,12,18 * * *
# 用途:多时段数据推送
18. 每 2 小时执行,但仅在工作日
0 */2 * * 1-5
# 用途:工作时间定期检查
19. 每月 1 号和 15 号凌晨 2 点
0 2 1,15 * *
# 用途:半月备份
20. 每周一、三、五 9:00 执行
0 9 * * 1,3,5
# 用途:隔天任务
Linux Crontab 使用指南
编辑 Crontab
# 编辑当前用户的 crontab
crontab -e
# 查看当前用户的 crontab
crontab -l
# 删除当前用户的 crontab
crontab -r
# 编辑其他用户的 crontab(需要 root 权限)
sudo crontab -u username -e
Crontab 文件格式
# 示例 crontab 文件
# m h dom mon dow command
# 每天凌晨 2 点备份数据库
0 2 * * * /usr/local/bin/backup.sh
# 每 5 分钟检查服务状态
*/5 * * * * /usr/local/bin/check_service.sh
# 每周日凌晨清理日志
0 3 * * 0 /usr/local/bin/cleanup_logs.sh
环境变量
Crontab 运行时的环境变量与登录 Shell 不同,需要手动设置:
# 在 crontab 开头设置环境变量
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
MAILTO=admin@example.com
# 定时任务
0 2 * * * /path/to/script.sh
日志输出
# 输出到文件
0 2 * * * /path/to/script.sh >> /var/log/cron.log 2>&1
# 发送邮件(需要配置 MAILTO)
0 2 * * * /path/to/script.sh
# 静默执行(不输出)
0 2 * * * /path/to/script.sh > /dev/null 2>&1
Kubernetes CronJob 应用
基本 CronJob 配置
apiVersion: batch/v1
kind: CronJob
metadata:
name: database-backup
spec:
# Cron 表达式
schedule: "0 2 * * *" # 每天凌晨 2 点
# 时区设置(Kubernetes 1.25+)
timeZone: "Asia/Shanghai"
# 任务模板
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-image:latest
command:
- /bin/sh
- -c
- /usr/local/bin/backup.sh
restartPolicy: OnFailure
# 并发策略
concurrencyPolicy: Forbid # 禁止并发执行
# 成功/失败历史记录保留数量
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
常用 K8s CronJob 示例
每 5 分钟数据同步
apiVersion: batch/v1
kind: CronJob
metadata:
name: data-sync
spec:
schedule: "*/5 * * * *"
jobTemplate:
spec:
template:
spec:
containers:
- name: sync
image: sync-service:latest
command: ["python", "/app/sync.py"]
restartPolicy: OnFailure
每周日凌晨全量备份
apiVersion: batch/v1
kind: CronJob
metadata:
name: weekly-backup
spec:
schedule: "0 3 * * 0" # 每周日 3:00
timeZone: "Asia/Shanghai"
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-tool:latest
volumeMounts:
- name: backup-volume
mountPath: /backup
volumes:
- name: backup-volume
persistentVolumeClaim:
claimName: backup-pvc
restartPolicy: OnFailure
最佳实践和注意事项
✅ 推荐做法
1. 避免使用 * * * * *(每分钟)
- 问题: 对系统资源消耗大
- 建议: 最少间隔 5 分钟,除非确实需要实时性
2. 错开高峰时段
# ❌ 不推荐:所有备份都在凌晨 0 点
0 0 * * * backup_db1.sh
0 0 * * * backup_db2.sh
# ✅ 推荐:错开时间
0 0 * * * backup_db1.sh
0 1 * * * backup_db2.sh
0 2 * * * backup_db3.sh
3. 使用绝对路径
# ❌ 不推荐
0 2 * * * backup.sh
# ✅ 推荐
0 2 * * * /usr/local/bin/backup.sh
4. 添加日志和错误处理
# ✅ 完整示例
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1 || echo "Backup failed" | mail -s "Backup Alert" admin@example.com
5. 测试 Cron 表达式
使用在线工具验证表达式:
- CronViz - 可视化 Cron 表达式生成器
- Crontab Guru - Cron 表达式验证
⚠️ 常见陷阱
1. 日期和星期冲突
# ⚠️ 这个表达式会在"每月 1 号" OR "每周一"执行,而不是"每月 1 号的周一"
0 9 1 * 1
# ✅ 如果只想在"每月 1 号"执行
0 9 1 * *
# ✅ 如果只想在"每周一"执行
0 9 * * 1
2. 时区问题
- Crontab 默认使用服务器本地时区
- Kubernetes CronJob 默认使用 UTC 时区(除非指定 timeZone)
- 确保时区设置正确,避免任务在错误时间执行
3. 权限问题
# 确保脚本有执行权限
chmod +x /usr/local/bin/script.sh
# 如果需要 sudo,使用 sudo crontab -e
常见问题 FAQ
Q1: Cron 表达式支持"秒"字段吗?
A: 标准 Linux Crontab 不支持秒,只有 5 个字段。部分系统(如 Quartz Scheduler)支持 6-7 个字段,包括秒。
# Linux Crontab(5 字段)
* * * * *
# Quartz(6 字段,增加秒)
* * * * * *
│ │ │ │ │ └─ 年(可选)
│ │ │ │ └─── 星期
│ │ │ └───── 月
│ │ └─────── 日
│ └───────── 小时
└─────────── 分钟
Q2: 如何每 30 秒执行一次?
A: Linux Crontab 不支持秒级,可以用脚本循环实现:
# 方法 1:使用 sleep 循环
* * * * * for i in 1 2; do /path/to/script.sh; sleep 30; done
# 方法 2:写一个常驻进程脚本
#!/bin/bash
while true; do
/path/to/script.sh
sleep 30
done
Q3: Cron 任务没有执行,如何调试?
A: 逐步检查:
-
检查 Cron 服务状态
sudo systemctl status cron # Ubuntu/Debian sudo systemctl status crond # CentOS/RHEL -
查看 Cron 日志
sudo tail -f /var/log/syslog # Ubuntu/Debian sudo tail -f /var/log/cron # CentOS/RHEL -
验证表达式语法 使用 CronViz 验证
-
检查脚本权限和路径
ls -l /path/to/script.sh which command # 检查命令路径 -
手动运行脚本
/path/to/script.sh # 看是否有错误输出
Q4: 如何禁用某个 Cron 任务?
A: 在行首添加 # 注释:
# 禁用这个任务
# 0 2 * * * /usr/local/bin/backup.sh
# 仍然启用
0 3 * * * /usr/local/bin/cleanup.sh
Q5: Cron 表达式可以指定"每月最后一天"吗?
A: 标准 Cron 不直接支持,需要脚本判断:
# 每天检查是否是月末
0 0 * * * [ $(date -d tomorrow +\%d) -eq 1 ] && /path/to/script.sh
总结
Cron 表达式是服务器自动化的基础工具,掌握它可以:
✅ 提升效率: 自动化重复任务 ✅ 降低成本: 减少人工操作 ✅ 增强可靠性: 定时备份、监控、清理
下一步行动
- 📝 立即尝试: 使用 CronViz 生成你的第一个 Cron 表达式
- 📚 深入学习: 阅读 初学者指南
- 💡 浏览示例: 查看 35+ 真实场景示例
相关资源:
标签: #cron表达式 #linux定时任务 #crontab #kubernetes #自动化运维
发布日期: 2025-10-30 最后更新: 2025-10-30 作者: CronViz 团队