cron表达式是啥?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cron表达式是啥?相关的知识,希望对你有一定的参考价值。
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year。
(2)Seconds Minutes Hours DayofMonth Month DayofWeek。
每一个域含义是:
(1)*:表示匹配该域的任意值。假如在Minutes域使用*, 即表示每分钟都会触发事件。
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。
例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。
参考技术ACron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,Cron有如下两种语法格式:
(1) Seconds Minutes Hours DayofMonth Month DayofWeek Year
(2)Seconds Minutes Hours DayofMonth Month DayofWeek
corn从左到右(用空格隔开):秒 分 小时 月份中的日期 月份 星期中的日期 年份
常用表达式例子:
(1)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
(2)0 15 10 * * ? 2005 2005年的每天上午10:15触发
cron表达式中的特殊字符
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
1、*:表示匹配该域的任意值,假如在Minutes域使用*,即表示每分钟都会触发事件。
2、-:表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次。
3、/:表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次。
4、,:表示列出枚举值值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
5、L:表示最后,只能出现在DayofWeek和DayofMonth域,如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
6、LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
7、#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
每 30 秒运行一次 cron 作业的最佳方式是啥? [复制]
【中文标题】每 30 秒运行一次 cron 作业的最佳方式是啥? [复制]【英文标题】:Which is the best way to run a cron job every 30 seconds? [duplicate]每 30 秒运行一次 cron 作业的最佳方式是什么? [复制] 【发布时间】:2012-11-14 06:43:26 【问题描述】:我想每 30 秒运行一次 cron 作业,但 cron 不允许调度作业的频率高于每分钟一次。
每 30 秒运行一次 cron 作业的最佳方式是什么?
【问题讨论】:
【参考方案1】:这是一种避免滑动窗口问题的方法。创建两个脚本,您的主要脚本(此处为 main.sh)和睡眠脚本(sleep30.sh):
main.sh:
#!/bin/bash
date >>/tmp/main.out
sleep30.sh:
#!/bin/bash
sleep 30
. $1
crontab:
* * * * * /pathtoscripts/sleep30.sh /pathtoscripts/main.sh
* * * * * /pathtoscripts/main.sh
不优雅,但应该可以。
【讨论】:
【参考方案2】:您可以使用 cron 的最短时间间隔是 1 分钟。 您可以在 bash 脚本中设置 sleep,但这可能是您能做的最好的事情
【讨论】:
【参考方案3】:如果任务执行时间短,可以忽略,可以这样:
* * * * * /path/cmd; sleep 30; /path/cmd
【讨论】:
【参考方案4】:简短的回答是您不能在一分钟内安排 cron 作业。您可以使用sleep 30
,但这会引入滑动窗口问题(任务现在间隔为 30 秒 + 任务的运行时间)。您可以将任务放在 while true
循环中,并让它检查每次迭代是否至少经过 30 秒,如果是,则再次运行任务,如果不是 sleep 1
【讨论】:
【参考方案5】:您可以升级到最新的 FreeBSD 测试版,它有一个特殊的新 cron 修饰符:@every_second。 将您的 cronjob 包裹在 lockf 中,休眠 30 秒,运行该作业,然后终止。这样一分钟可以运行两次。
【讨论】:
以上是关于cron表达式是啥?的主要内容,如果未能解决你的问题,请参考以下文章