CronViz - Free Online Cron Expression Generator and Scheduler Tool
Cron Expression Generator

数据定时任务Cron表达式

Cron 表达式完全指南:从入门到精通

适合人群: Linux 运维工程师、后端开发者、DevOps 工程师 阅读时长: 15 分钟 难度级别: ⭐⭐ 初级到中级

目录

  1. 什么是 Cron 表达式?
  2. Cron 表达式的 5 个字段
  3. 特殊字符详解
  4. 20+ 个实用示例
  5. Linux Crontab 使用指南
  6. Kubernetes CronJob 应用
  7. 最佳实践和注意事项
  8. 常见问题 FAQ

什么是 Cron 表达式?

Cron 表达式是一种用于配置定时任务的时间格式,广泛应用于 Linux/Unix 系统KubernetesSpring 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 都表示周日)。

表达式含义
*每天
07每周日
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 表达式

使用在线工具验证表达式:

⚠️ 常见陷阱

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: 逐步检查:

  1. 检查 Cron 服务状态

    sudo systemctl status cron    # Ubuntu/Debian
    sudo systemctl status crond   # CentOS/RHEL
    
  2. 查看 Cron 日志

    sudo tail -f /var/log/syslog  # Ubuntu/Debian
    sudo tail -f /var/log/cron    # CentOS/RHEL
    
  3. 验证表达式语法 使用 CronViz 验证

  4. 检查脚本权限和路径

    ls -l /path/to/script.sh
    which command  # 检查命令路径
    
  5. 手动运行脚本

    /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 表达式是服务器自动化的基础工具,掌握它可以:

提升效率: 自动化重复任务 ✅ 降低成本: 减少人工操作 ✅ 增强可靠性: 定时备份、监控、清理

下一步行动

  1. 📝 立即尝试: 使用 CronViz 生成你的第一个 Cron 表达式
  2. 📚 深入学习: 阅读 初学者指南
  3. 💡 浏览示例: 查看 35+ 真实场景示例

相关资源:

标签: #cron表达式 #linux定时任务 #crontab #kubernetes #自动化运维

发布日期: 2025-10-30 最后更新: 2025-10-30 作者: CronViz 团队

立即生成你的 Cron 表达式

使用 CronViz 可视化编辑器,无需记忆语法,轻松创建定时任务

开始使用 →