无论你是在调度备份、自动化部署还是运行定期清理脚本,cron 都是 Unix/Linux 系统上任务调度的核心。本速查表提供 50+ 个可直接复制粘贴的 cron 表达式示例,按频率分类,并包含 crontab 命令、平台差异和常见陷阱。
1. Cron 表达式语法
标准 cron 表达式由空格分隔的 5 个字段组成,每个字段控制任务何时运行:
┌───────────── 分钟 (0–59)
│ ┌─────────── 小时 (0–23)
│ │ ┌───────── 日 (1–31)
│ │ │ ┌─────── 月 (1–12 或 JAN–DEC)
│ │ │ │ ┌───── 星期 (0–7 或 SUN–SAT,0 和 7 = 周日)
│ │ │ │ │
* * * * * command_to_execute命令跟在五个字段之后。使用我们的 Cron 生成器工具可视化构建表达式。
2. 特殊字符说明
Cron 使用四个特殊字符来定义超出固定值的调度:
| 字符 | 含义 | 示例 | 说明 |
|---|---|---|---|
| * | 匹配该字段的每个可能值 | * * * * * | Every minute |
| , | 指定值列表(如 1,3,5) | 0 9 * * 1,3,5 | Mon, Wed, Fri at 9 AM |
| - | 定义范围(如 1–5 表示 1 到 5) | 0 9 * * 1-5 | Mon through Fri at 9 AM |
| / | 定义步长间隔(如 */5 表示每 5 个单位) | */10 * * * * | Every 10 minutes |
3. 50+ 个 Cron 表达式示例
以下表格涵盖最常用的 cron 调度。每个表达式都可以直接复制粘贴到你的 crontab 中。
每 X 分钟
| 表达式 | 说明 | 下次运行示例 |
|---|---|---|
| * * * * * | Every minute | 10:00, 10:01, 10:02 ... |
| */1 * * * * | Every minute (explicit) | 10:00, 10:01, 10:02 ... |
| */2 * * * * | Every 2 minutes | 10:00, 10:02, 10:04 ... |
| */5 * * * * | Every 5 minutes | 10:00, 10:05, 10:10 ... |
| */10 * * * * | Every 10 minutes | 10:00, 10:10, 10:20 ... |
| */15 * * * * | Every 15 minutes | 10:00, 10:15, 10:30, 10:45 |
| */20 * * * * | Every 20 minutes | 10:00, 10:20, 10:40 ... |
| */30 * * * * | Every 30 minutes | 10:00, 10:30, 11:00 ... |
| 0,15,30,45 * * * * | At 0, 15, 30, 45 minutes past each hour | 10:00, 10:15, 10:30, 10:45 |
每小时调度
| 表达式 | 说明 | 下次运行示例 |
|---|---|---|
| 0 * * * * | Every hour (at minute 0) | 10:00, 11:00, 12:00 ... |
| 30 * * * * | Every hour at minute 30 | 10:30, 11:30, 12:30 ... |
| 15 * * * * | Every hour at minute 15 | 10:15, 11:15, 12:15 ... |
| 0 */2 * * * | Every 2 hours | 00:00, 02:00, 04:00 ... |
| 0 */3 * * * | Every 3 hours | 00:00, 03:00, 06:00 ... |
| 0 */4 * * * | Every 4 hours | 00:00, 04:00, 08:00 ... |
| 0 */6 * * * | Every 6 hours | 00:00, 06:00, 12:00, 18:00 |
| 0 */8 * * * | Every 8 hours | 00:00, 08:00, 16:00 |
| 0 */12 * * * | Every 12 hours | 00:00, 12:00 |
每天调度
| 表达式 | 说明 | 下次运行示例 |
|---|---|---|
| 0 0 * * * | Daily at midnight (00:00) | Tomorrow 00:00 |
| 0 1 * * * | Daily at 1:00 AM | Tomorrow 01:00 |
| 0 6 * * * | Daily at 6:00 AM | Tomorrow 06:00 |
| 30 7 * * * | Daily at 7:30 AM | Tomorrow 07:30 |
| 0 9 * * * | Daily at 9:00 AM | Tomorrow 09:00 |
| 30 8 * * * | Daily at 8:30 AM | Tomorrow 08:30 |
| 0 12 * * * | Daily at noon (12:00) | Tomorrow 12:00 |
| 0 15 * * * | Daily at 3:00 PM | Tomorrow 15:00 |
| 0 18 * * * | Daily at 6:00 PM | Tomorrow 18:00 |
| 0 23 * * * | Daily at 11:00 PM | Tomorrow 23:00 |
| 0 8-17 * * * | Every hour from 8 AM to 5 PM | 08:00, 09:00 ... 17:00 |
| 0 9,12,18 * * * | Three times a day (9 AM, noon, 6 PM) | 09:00, 12:00, 18:00 |
每周调度
| 表达式 | 说明 | 下次运行示例 |
|---|---|---|
| 0 9 * * 1 | Every Monday at 9:00 AM | Next Monday 09:00 |
| 0 9 * * 1-5 | Weekdays (Mon-Fri) at 9:00 AM | Next weekday 09:00 |
| 0 0 * * 0 | Every Sunday at midnight | Next Sunday 00:00 |
| 0 0 * * 6,0 | Saturday & Sunday at midnight | Next Sat/Sun 00:00 |
| 0 17 * * 5 | Every Friday at 5:00 PM | Next Friday 17:00 |
| 0 9 * * 1,3,5 | Mon, Wed, Fri at 9:00 AM | Next Mon/Wed/Fri 09:00 |
| 0 8-17 * * 1-5 | Hourly 8AM–5PM, weekdays only | Next weekday 08:00 |
| 30 6 * * 1-5 | Weekdays at 6:30 AM | Next weekday 06:30 |
每月调度
| 表达式 | 说明 | 下次运行示例 |
|---|---|---|
| 0 0 1 * * | 1st of every month at midnight | Next month, 1st 00:00 |
| 0 0 15 * * | 15th of every month at midnight | Next 15th 00:00 |
| 0 9 1 * * | 1st of every month at 9:00 AM | Next month, 1st 09:00 |
| 0 0 1,15 * * | 1st and 15th at midnight | Next 1st or 15th 00:00 |
| 0 0 * * 5L | Last Friday of the month (non-std) | Last Fri 00:00 |
| 0 9 * * 1#1 | First Monday of the month (non-std) | First Mon 09:00 |
| 0 0 28 * * | 28th of every month at midnight | Next 28th 00:00 |
每年/每季度调度
| 表达式 | 说明 | 下次运行示例 |
|---|---|---|
| 0 0 1 1 * | January 1st at midnight | Jan 1 00:00 |
| 0 0 1 1,4,7,10 * | Quarterly: Jan, Apr, Jul, Oct 1st | Next quarter 00:00 |
| 0 0 1 1,7 * | Bi-annually: Jan 1 & Jul 1 | Jan 1 or Jul 1 00:00 |
| 0 0 25 12 * | December 25th at midnight | Dec 25 00:00 |
| 0 0 1 */3 * | Every 3 months on the 1st | Next 1st in 3 months |
| 0 0 1 */6 * | Every 6 months on the 1st | Next 1st in 6 months |
业务与 DevOps 调度
| 表达式 | 说明 | 下次运行示例 |
|---|---|---|
| 0 2 * * * | Database backup at 2:00 AM daily | Tomorrow 02:00 |
| 0 3 * * 0 | Log rotation every Sunday at 3 AM | Next Sunday 03:00 |
| 0 4 1 * * | Monthly DB cleanup on 1st at 4 AM | Next month, 1st 04:00 |
| 0 1 * * * | SSL cert check daily at 1 AM | Tomorrow 01:00 |
| */5 * * * * | Health check every 5 minutes | 10:00, 10:05, 10:10 ... |
| 0 5 * * 1-5 | Deploy window: weekdays at 5 AM | Next weekday 05:00 |
| 0 0 * * * | Rotate logs daily at midnight | Tomorrow 00:00 |
| 0 */4 * * * | Send report digest every 4 hours | 00:00, 04:00, 08:00 ... |
| 0 22 * * 5 | Friday night maintenance at 10 PM | Next Friday 22:00 |
| 30 2 * * * | Temp file cleanup at 2:30 AM daily | Tomorrow 02:30 |
4. Crontab 命令速查
crontab 命令用于管理用户级 cron 任务文件。以下是核心命令:
| 命令 | 作用 |
|---|---|
| crontab -e | Edit your crontab file (opens in default editor) |
| crontab -l | List all cron jobs for the current user |
| crontab -r | Remove all cron jobs for the current user (use with caution!) |
| crontab -u alice -l | List cron jobs for a specific user (requires root) |
| crontab -u alice -e | Edit crontab for a specific user (requires root) |
| crontab filename | Install a crontab from a file (overwrites existing) |
# Edit crontab
crontab -e
# List all cron jobs
crontab -l
# Backup current crontab to a file
crontab -l > my-crontab-backup.txt
# Install crontab from a file
crontab my-crontab-backup.txt
# Remove all cron jobs (careful!)
crontab -r5. 各平台 Cron 语法差异
Cron 语法在不同平台略有差异,以下是你需要了解的关键区别:
5 个字段:分钟 小时 日 月 星期。最原始和最常见的格式。
# Standard 5-field crontab
*/5 * * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1在 schedule.cron 中使用标准 5 字段。始终以 UTC 运行。最小间隔:5 分钟。
# .github/workflows/scheduled.yml
on:
schedule:
- cron: '0 9 * * 1-5' # Weekdays 9AM UTC6 个字段(增加年份)。使用 ? 替代日或星期。包裹在 cron() 中。
# AWS EventBridge (6 fields, note the ?)
cron(0 9 ? * MON-FRI *) # Weekdays 9AM UTC在 schedule 规范中使用标准 5 字段。K8s 1.27+ 通过 timeZone 支持时区。
# Kubernetes CronJob spec
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *"
timeZone: "America/New_York" # K8s 1.27+在 vercel.json 中使用标准 5 字段。以 UTC 运行。免费计划:最多 2 个 cron 任务,每天最少 1 次。
// vercel.json
{
"crons": [{
"path": "/api/cron/daily-report",
"schedule": "0 9 * * *"
}]
}6. Cron 表达式常见陷阱
以下是开发者在使用 cron 调度时最常犯的错误:
Cron 默认在系统时区运行。CI/CD 平台(GitHub Actions、Vercel)使用 UTC。务必确认你的 cron 守护进程使用哪个时区。
如果任务耗时超过间隔(如 5 分钟调度中的 10 分钟任务),会产生重叠运行。使用 flock 或 PID 锁文件防止此问题。
当时钟向前拨时,在跳过的小时调度的任务将不会运行。当时钟向后拨时,任务可能运行两次。使用 UTC 可避免此问题。
在标准 cron 中,如果日和星期都被设置(非 *),任务在任一匹配时运行 — 不是两者都满足。这是常见的混淆来源。
标准 cron 不支持秒级调度。最小分辨率是 1 分钟。要实现亚分钟调度,可在 cron 任务中使用带 sleep 的循环。
Cron 任务以最小环境运行。你的 $PATH 可能不包含预期的程序。在 cron 命令中始终使用完整路径。
# Gotcha: overlapping runs - use flock to prevent
*/5 * * * * /usr/bin/flock -n /tmp/myjob.lock /path/to/script.sh
# Gotcha: environment - always use full paths
0 2 * * * /usr/bin/python3 /home/user/scripts/backup.py >> /var/log/backup.log 2>&1
# Gotcha: 30-second workaround (two entries)
* * * * * /path/to/script.sh
* * * * * sleep 30 && /path/to/script.sh
# Gotcha: PATH not set - define it at the top of your crontab
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# Gotcha: percent signs (%) must be escaped in crontab
# Wrong:
0 0 * * * echo "Today is $(date +%Y-%m-%d)"
# Correct:
0 0 * * * echo "Today is $(date +\%Y-\%m-\%d)"Sample Crontab File
Here is a complete, real-world crontab file combining several patterns discussed above:
# =============================================
# Crontab for: webserver (production)
# Last updated: 2025-01-15
# =============================================
# Environment
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO="ops-team@example.com"
# --- BACKUPS ---
# Full database backup at 2:00 AM daily
0 2 * * * /usr/bin/flock -n /tmp/db-backup.lock /opt/scripts/db-backup.sh >> /var/log/db-backup.log 2>&1
# Incremental file backup every 6 hours
0 */6 * * * /opt/scripts/file-backup.sh >> /var/log/file-backup.log 2>&1
# --- MAINTENANCE ---
# Clear temp files older than 7 days, daily at 3 AM
0 3 * * * /usr/bin/find /tmp -type f -mtime +7 -delete
# Rotate application logs every Sunday at 4 AM
0 4 * * 0 /opt/scripts/rotate-logs.sh >> /var/log/log-rotation.log 2>&1
# --- MONITORING ---
# Health check every 5 minutes
*/5 * * * * /opt/scripts/healthcheck.sh > /dev/null 2>&1
# SSL certificate expiry check daily at 6 AM
0 6 * * * /opt/scripts/check-ssl.sh
# Disk space alert if usage > 90%, every hour
0 * * * * /opt/scripts/disk-alert.sh
# --- REPORTS ---
# Send daily summary at 8 AM on weekdays
0 8 * * 1-5 /opt/scripts/daily-report.sh
# Monthly analytics report on the 1st at 9 AM
0 9 1 * * /opt/scripts/monthly-report.sh7. 测试与调试 Cron
在将 cron 任务部署到生产环境之前,验证它是否按预期工作:
将你的表达式粘贴到我们的 Cron 表达式解析器中,查看接下来 10 次运行时间和人类可读的解释。
在大多数 Linux 系统上,cron 日志在 /var/log/syslog 或 /var/log/cron 中。使用 grep CRON /var/log/syslog 过滤。
将 stdout 和 stderr 捕获到日志文件中以便调试。这可以防止 cron 为每次执行发送邮件。
在提交月度调度之前,先用 * * * * *(每分钟)测试以确保脚本正确运行,然后再更改为目标调度。
默认情况下,cron 将输出通过邮件发送给用户。在 crontab 顶部设置 MAILTO="" 来禁用邮件,或设置为真实地址接收告警。
# Redirect all output to a log file
0 2 * * * /path/to/backup.sh >> /var/log/cron-backup.log 2>&1
# Disable cron mail for this job
0 2 * * * /path/to/backup.sh > /dev/null 2>&1
# Set MAILTO at the top of crontab
MAILTO=""
# Or send to a real address
MAILTO="admin@example.com"
# Check cron logs on Debian/Ubuntu
grep CRON /var/log/syslog | tail -20
# Check cron logs on CentOS/RHEL
grep CRON /var/log/cron | tail -20
# On systems using journald (systemd)
journalctl -u cron --since "1 hour ago"
# Quick test: add a job that writes to a file
# Then check if the file gets updated
* * * * * echo "cron works: $(date)" >> /tmp/cron-test.log
# Verify your crontab was saved correctly
crontab -l | grep -v '^#'
# Check if cron daemon is running
systemctl status cron # Debian/Ubuntu
systemctl status crond # CentOS/RHELCommon Cron Debugging Checklist
| Check | How to Verify |
|---|---|
| Cron daemon running? | systemctl status cron (or crond) |
| Crontab saved? | crontab -l and look for your entry |
| Script executable? | chmod +x /path/to/script.sh |
| Full paths used? | Use which python3 to find full path |
| Output captured? | Add >> /tmp/debug.log 2>&1 |
| Permissions correct? | Script owner = crontab owner |
| No syntax errors? | bash -n /path/to/script.sh |
| Timezone correct? | timedatectl or date to check |
交互式构建和测试你的 cron 表达式:
8. 常见问题
Cron 表达式的格式是什么?
标准 cron 表达式有 5 个空格分隔的字段:分钟 (0-59)、小时 (0-23)、日 (1-31)、月 (1-12) 和星期 (0-7)。例如 "0 9 * * 1-5" 表示每个工作日上午 9:00。
*/5 在 cron 中是什么意思?
*/5 语法表示该字段"每 5 个单位"。在分钟字段中,*/5 * * * * 每 5 分钟运行一次(在 0、5、10、15...55 分钟时)。在小时字段中,0 */5 * * * 每 5 小时在第 0 分钟运行。
如何每 30 秒运行一次 cron 任务?
标准 cron 不支持亚分钟间隔。解决方法是创建两个 cron 条目:一个在整分钟运行,另一个加 30 秒延迟:* * * * * /path/to/script.sh 和 * * * * * sleep 30 && /path/to/script.sh
cron 和 crontab 有什么区别?
Cron 是执行定时任务的后台守护进程(服务)。Crontab(cron 表)是列出定时任务及其时间安排的文件。你使用 "crontab" 命令来编辑、列出或删除个人的 cron 表。
可以在 Windows 上使用 cron 吗?
原生 Windows 没有 cron。等效工具是任务计划程序 (schtasks.exe)。但如果你使用 WSL(Windows Linux 子系统),可以正常使用 cron。Windows 上的 Docker 容器也支持 cron。