停止搜索Cron语法——那里有一个生成器
Cron表达式是那些你经常使用但总是记不住的东西之一。这里解释了五个字段的实际含义、容易让人出错的地方,以及为什么使用在线Cron表达式生成器是更聪明的选择。
现在是凌晨2点。部署计划在早上6点进行。你需要再次确认一下定时任务是否会准时触发。于是你打开一个新的标签页,输入“cron语法”到谷歌搜索框里,再次搜索一遍。
这是一段必经的历程。每一个接触过Linux服务器的开发者都至少经历过一次——而我们大多数人可能比自己承认的还要多次经历过。cron表达式就是这类你经常使用却始终无法记住的东西。它的语法处于“过于简单以至于无需查阅”和“足够具体以至于容易出错”之间的尴尬地带。
有一种更好的方法。使用一个 在线的cron表达式生成器 让工具来处理语法,而你则专注于真正重要的事情。
为什么cron语法难以记住
cron有五个字段。五个。就这些。然而,人们每次都会被字段顺序搞糊涂:
# ┌───────────── minute (0–59)
# │ ┌───────────── hour (0–23)
# │ │ ┌───────────── day of month (1–31)
# │ │ │ ┌───────────── month (1–12)
# │ │ │ │ ┌───────────── day of week (0–6, Sunday=0)
# │ │ │ │ │
* * * * * command
问题不在于它难——而在于它恰好包含足够多的特殊字符,从而引发歧义。是“每5分钟”还是“第5分钟”?是 */5 在上午9点还是晚上9点运行?如果忘记月份是1索引而星期从0开始呢? 0 9 * * 1-5 这些不是新手才会遇到的问题,而是每个人都会遇到的陷阱。配置错误的cron任务是导致生产环境事故的安静方式之一——那种情况不会立即崩溃,只是默默地不运行,直到三天后你才注意到。
五个字段的详细解释(不加仪式)
以下是实用版本:
分钟
- (0–59) —— 任务运行的小时中的分钟。 表示第30分钟。
30表示每15分钟一次。*/15小时 - (0–23) —— 使用24小时制。 表示上午9点。
9表示下午5点。没有上午/下午的混淆。17日期 - (1–31) —— 月份中的哪一天。 表示该月的第一天。
1表示该月的第15天。15月份 - (1–12) —— 一月是 ,十二月是
1。你也可以使用名称:12,等等。JAN,FEB星期几 - (0–6 或 1–7) —— 星期日可以是 ,取决于你的cron实现方式。星期一始终是
0或7。这是最容易引起混淆的字段。1重要的特殊字符
— 表示所有可能的值(每分钟、每小时等)
*— 表示每*/n个间隔。 无在分钟字段中表示每5分钟一次。*/5— 表示一个范围。a-b在星期字段中表示周一到周五。1-5— 表示一个列表。a,b,c表示周一、周三、周五。1,3,5— 简写别名。并非所有系统都支持。@reboot,@hourly,@daily常见的错误会让人吃亏
1. 忘记时区
cron在服务器本地时区运行。如果服务器使用UTC,而你在纽约,
不会在东部时间上午9点运行——它会在凌晨4点或5点运行,具体取决于夏令时。始终了解你的服务器时区。始终如此。 0 9 * * * 2. 同时使用“日”和“星期”字段
如果你在“日”字段和“星期”字段中都指定了值(而不是
其中一个),大多数cron实现会将其视为“或”关系——任务在任一条件满足时运行。这几乎从来不是你想要的结果。 且 3. 期望 */1 表示“仅一次” * 与
相同。它表示“每”。标准cron中没有“仅运行一次”的表达方式——要实现这一点,你需要使用
*/1 或一次性systemd定时器。 *4. 部署前未进行测试 at cron不会提供即时反馈。你编写表达式,保存crontab,然后等待。如果表达式错误,你将在凌晨3点才意识到计划的备份任务没有运行。这就是为什么在部署前使用一个
cron下一次运行计算器
值得你花费的30秒。 改用cron表达式生成器 诚恳的建议:不要再试图从记忆中手写cron表达式。使用生成器。这不是软弱的表现,而是避免生产环境中的愚蠢错误的方法。
IOTools上的cron表达式生成器
让你能够可视化地构建任何表达式——选择你的分钟间隔、小时、星期几,它会显示你生成的完整表达式以及一个用普通语言解释的运行时间说明。无需记忆,无需打开文档。
这 一旦你有了表达式,就通过 进行验证。粘贴表达式,获取接下来5到10次的预定运行时间。这只需要五秒钟,就能立刻告诉你是否不小心将清理任务设置为每分钟运行一次,而不是每天一次。
这个二次检查是大多数人会跳过的步骤。不要跳过。 改用cron表达式生成器快速参考:你实际会使用的表达式
表达式
每小时,整点运行
| 每天上午9点 | 意义 |
|---|---|
* * * * * | 每分钟 |
0 * * * * | 工作日的上午9点 |
0 9 * * * | 每周日午夜 |
0 9 * * 1-5 | 每月第一天午夜 |
*/15 * * * * | 每15分钟 |
0 0 * * 0 | 每月1日和15日,凌晨4:30 |
0 0 1 * * | 工作日的晚上10点 |
30 4 1,15 * * | 每天午夜运行一次(简写形式) |
0 22 * * 1-5 | 工作日晚上10点 |
@daily | 每天午夜一次(简写) |
