crontab 解释器

使用人类可读的文本和下一次运行时间来解析 cron 表达式。

免费在线 Crontab 和 Cron 表达式解释器

像 0 */5 * * * 这样的 Cron 表达式紧凑但神秘。 Dokall 将任何有效的 cron 表达式转换为人类可读的文本并显示即将到来的运行时间,以便您可以在部署之前验证计划。

DevOps 工程师和后端开发人员使用此工具来仔细检查计划的作业、调试计时问题并为团队记录 cron 配置。

什么是 Cron?

Cron 是类 Unix 操作系统中基于时间的任务调度器。它在预定时间自动运行命令或脚本——每分钟、每天午夜、每周一上午 9 点,或你能表达的任何其他计划。cron 守护进程在后台运行,每分钟检查一次计划。

每个用户都有一个 crontab(cron 表)文件,列出其计划任务。系统级 cron 任务位于 /etc/crontab 和 /etc/cron.d/。cron 系统是服务器管理的基础——它处理日志轮转、备份、数据库维护、邮件报告、缓存清理以及无数其他自动化任务。

Cron 表达式格式

标准 cron 表达式有五个以空格分隔的字段:分钟(0–59)、小时(0–23)、日(1–31)、月(1–12)和星期(0–7,其中 0 和 7 都表示星期日)。

每个字段可以是具体值(5)、范围(1–5)、列表(1,3,5)、步进(*/5),或星号(*)表示所有值。表达式 30 2 * * 1 表示「周一凌晨 2:30」。表达式 0 */4 * * * 表示「每第 4 个小时的第 0 分钟」(午夜、凌晨 4 点、上午 8 点、中午、下午 4 点、晚上 8 点)。

某些 cron 实现(如 Quartz)会增加第六个字段表示秒,以及第七个字段表示年。AWS CloudWatch Events 和 GitHub Actions 使用略有不同的语法。本工具解析标准的 5 字段 Unix cron 表达式。

Cron 表达式中的特殊字符

星号(*)表示「每一个」。小时字段中的 * 表示每小时。星期字段中的 * 表示每天。

逗号(,)分隔列表值。星期字段中的 1,3,5 表示周一、周三和周五。

连字符(-)定义范围。小时字段中的 9-17 表示从上午 9 点到下午 5 点的每个小时。

斜杠(/)定义步进。分钟字段中的 */5 表示每第 5 分钟(0、5、10、15…)。1-30/2 表示从 1 到 30 每隔 2 分钟(1、3、5、7…)。

某些实现支持额外字符:L(月末最后一天)、W(最近工作日)、#(月第 n 个星期几,例如 2#1 = 第一个周一),以及 ?(无特定值,在已指定另一个日期字段时使用)。

常用 Cron 计划

每分钟:* * * * * —— 适用于健康检查和实时监控,但需考虑负载。

每 5 分钟:*/5 * * * * —— 轮询、缓存更新和队列处理的常用间隔。

每小时:0 * * * * —— 在每小时的第 0 分钟运行。适合小时级报告和数据同步。

每天午夜:0 0 * * * —— 经典的每日任务,用于备份、日志轮转和报告。

每个工作日上午 9 点:0 9 * * 1-5 —— 周一至周五运行。常用于工作时间任务和每日通知。

每月第一天:0 0 1 * * —— 在 1 号午夜运行。适合月度计费、报告和清理。

每周日凌晨 2 点:0 2 * * 0 —— 每周维护窗口。选择流量较低的时间。

Cron 最佳实践

始终将输出重定向到日志文件:*/5 * * * * /path/to/script.sh >> /var/log/myjob.log 2>&1。没有重定向时,cron 会通过邮件发送输出(或在未配置邮件时静默丢弃),你会丢失调试信息。

对命令和文件使用绝对路径。Cron 以最小环境运行——你的 PATH 可能不包含 /usr/local/bin 或交互式 shell 中使用的其他目录。指定完整路径,或在 crontab 顶部设置 PATH。

添加错误处理和锁定。如果任务运行时间长于间隔,下一次调用会在第一次仍在运行时启动。使用 flock 或 PID 文件防止重叠:* * * * * flock -n /tmp/myjob.lock /path/to/script.sh。

部署前测试计划。将 cron 表达式粘贴到本解释器中,确认下次运行时间符合预期。常见错误是混淆日字段和星期字段。

监控你的 cron 任务。使用 cron 监控服务(Cronitor、Healthchecks.io),在计划任务未运行或耗时过长时向你发出警报。

常见问题

cron 与 crontab 有什么区别?
Cron 是执行计划命令的守护进程(后台服务)。Crontab(cron 表)是定义计划的配置文件。crontab 命令也用于编辑该文件:crontab -e 打开你的 crontab 进行编辑,crontab -l 列出当前条目,crontab -r 删除所有条目。
如何让 cron 任务每 5 分钟运行一次?
使用表达式 */5 * * * * 后跟你的命令。分钟字段中的 */5 表示「每第 5 分钟」——任务在每小时的 :00、:05、:10、:15、:20、:25、:30、:35、:40、:45、:50 和 :55 运行。
cron 表达式中的 */5 是什么意思?
斜杠(/)是步进值。*/5 表示「从最小值起每隔 5 个值」。在分钟字段(范围 0–59)中,*/5 展开为 0,5,10,15,20,25,30,35,40,45,50,55。在小时字段(范围 0–23)中,*/5 展开为 0,5,10,15,20。也可以对范围使用步进:1-30/5 表示从 1 到 30 每隔 5 分钟。
如何编辑我的 crontab?
在终端运行 crontab -e。这会在默认文本编辑器(通常是 vi 或 nano)中打开你的 crontab 文件。每行添加一个任务,格式为:分钟 小时 日 月 星期 命令。保存并退出——cron 会立即生效。运行 crontab -l 验证你的条目。
cron 能每秒运行一次任务吗?
不能。标准 cron 的最小粒度是一分钟。要每秒运行任务,需要其他方法:脚本中的循环(while true; do command; sleep 1; done)、带 OnUnitActiveSec=1s 的 systemd 定时器,或进程监管程序。多数情况下,若需要亚分钟调度,cron 并非合适的工具。
如果 cron 任务运行时间超过间隔会怎样?
Cron 会无论如何启动新实例——它不会检查上次运行是否仍在进行。这可能导致重叠执行、资源争用和数据损坏。用文件锁防止:flock -n /tmp/myjob.lock /path/to/script.sh。-n 标志使 flock 在锁被占用时立即退出,从而跳过重叠运行。
如何调试失败的 cron 任务?
首先检查 cron 日志:grep CRON /var/log/syslog(Ubuntu)或 /var/log/cron(CentOS)。将任务输出重定向到文件:* * * * * /path/to/script.sh >> /tmp/debug.log 2>&1。常见问题:错误的 PATH(使用绝对路径)、权限错误(cron 用户可能与 shell 用户不同),以及缺少环境变量(cron 以最小环境运行)。