常用工具及查询🤖 AI 导航HOT寒霜启示录游戏工具攻略文章关于

Cron 表达式怎么写:5 个字段、12 个常用例子和易错点

作者:冰原老猫 · 发布:2026-10-22 · 分类:开发入门

广告位(预留,AdSense 审核通过后启用)

定时备份数据库、每天早上发报表、每 5 分钟检查一次网站——这类“按时间自动执行”的任务,在 Linux 上最常用的工具是 cron。它用一行“Cron 表达式”描述执行时间。写对了一劳永逸,写错了可能每分钟执行一次,或者永远不执行。

一、5 个字段

标准 crontab 每行格式为:

分 时 日 月 周  要执行的命令
*  *  *  *  *  command

二、特殊符号

三、12 个常用例子

*/5 * * * *        每 5 分钟
0 * * * *          每小时整点
30 2 * * *         每天 02:30
0 9 * * 1-5        工作日(周一到周五)09:00
0 9,18 * * *       每天 09:00 和 18:00
0 0 * * 0          每周日 00:00
0 3 1 * *          每月 1 日 03:00
0 0 1 1 *          每年 1 月 1 日 00:00
*/15 9-18 * * 1-5  工作日 9:00–18:59 每 15 分钟
0 */6 * * *        每 6 小时(0、6、12、18 点)
15 10 * * 6        每周六 10:15
@reboot            系统启动时执行一次(部分 cron 实现支持)

四、最容易写错的地方

1. 第一个字段写成 *:* 2 * * * 不是“每天 2 点执行一次”,而是“每天 2:00 到 2:59 每分钟执行一次”,共 60 次。想每天执行一次,分钟必须写具体数字。

2. 日和周同时指定:在常见的 Vixie cron 中,如果“日”和“周”都不是 *,两者是“或”的关系。0 0 13 * 5 表示每月 13 日或每个周五,而不是“13 号恰好是周五”。

3. 每月最后一天:标准 cron 没有直接的写法。常见办法是每月 28–31 日都执行,在命令里判断明天是不是 1 号:

0 23 28-31 * * [ "$(date -d tomorrow +\%d)" = "01" ] && /path/to/job.sh

注意在 crontab 里 % 有特殊含义(会被当作换行),必须写成 \%。

4. 时区:cron 按服务器的系统时区执行。云服务器默认常常是 UTC,你写的 0 9 * * * 实际是北京时间 17:00。用 timedatectl 或 date 命令确认系统时区。

5. 环境变量不同:cron 运行时的 PATH 等环境变量比你登录后的终端少得多,命令在终端能跑、在 cron 里却“找不到命令”。解决办法是写命令的绝对路径,或在 crontab 顶部设置 PATH。

6. 没有日志:任务失败了也不知道。建议把输出重定向到日志文件:

30 2 * * * /opt/backup.sh >> /var/log/backup.log 2>&1

五、编辑和查看

crontab -e     # 编辑当前用户的定时任务
crontab -l     # 查看
crontab -r     # 删除全部(慎用,容易和 -e 按错)

建议修改前先 crontab -l > crontab.bak 备份一份。

六、6 位和 7 位的 Cron

Java 的 Quartz、Spring 的 @Scheduled 等框架使用带“秒”字段的格式,例如 Spring 是 6 个字段:秒 分 时 日 月 周,Quartz 还可以有第 7 个“年”字段,并支持 ?、L(最后一天)、W、# 等扩展符号。把 Linux 的 5 位表达式直接贴到这些框架里,含义会整体错位。云平台的定时触发器也各有格式,以对应文档为准。

七、检查清单

  1. 分钟字段是否写了具体数字。
  2. 服务器时区是否符合预期。
  3. 命令是否使用绝对路径,能否在最简环境下运行。
  4. 输出是否写入了日志。
  5. 表达式是否用于正确的系统(5 位还是 6 位)。

本站首页“开发”分类收录了在线 Cron 表达式生成和解析工具,可以把写好的表达式粘进去,看看接下来几次的执行时间。日志中的时间戳可以用本站的 时间戳转换工具 换算,便于确认任务是否在预期时间运行。

广告位(预留,AdSense 审核通过后启用)

相关站内工具

同类文章

← 全部文章