是否可以每三天运行一次cronjob?或者每月10次。
答案 0 :(得分:92)
每三天运行一次......
0 0 */3 * *
那怎么样?
如果您希望它在该月的特定日期运行,例如第1天,第4天,第7天等,那么您可以在脚本中设置一个条件来检查当月的当天。
if (((date('j') - 1) % 3))
exit();
或者,正如@mario指出的那样,您可以使用日期('k')来获取一年中的某一天,而不是根据当月的日期来完成。
答案 1 :(得分:60)
* * */3 * * that says, every minute of every hour on every three days.
0 0 */3 * * says at 00:00 (midnight) every three days.
答案 2 :(得分:11)
因为cron是"无状态",它无法准确地表达"频率",只有"模式"它(显然)与当前时间持续匹配。
改述你的问题会让这更加明显:"是否可以在每晚00:01运行一个cronjob,除了在2晚内运行时跳过夜晚?"当cron将当前时间与工作请求时间模式进行比较时,cron无法知道它是否在过去运行你的工作。
(当然可以编写一个记录过去作业的有状态cron,因此包含匹配此状态的模式,但这不是大多数操作系统中包含的标准cron。这样的系统会变得复杂需要引入何时此类模式的概念"重置"。例如,当时间改变时模式重置(即crontab条目被修改)?查看您最喜欢的日历应用程序,看看有多复杂它可以表达重复的预定事件模式,并注意他们没有重置问题,因为开始日历事件有一个自然的"开始" a / k / a"重置& #34;日期。尝试重新安排每隔一周重复发生的日历事件,推迟一周,例如圣诞节。通常你必须终止那个重复发生的事件并重新启动一个全新的事件;这说明了有限的表达方式。复杂的日历应用程序代表重复patt ERNS。当然,日历有很多状态 - 每个单独的事件都可以独立删除或重新安排[在大多数日历应用程序中]。)
此外,你可能希望每隔一个晚上做一次如果成功,但如果最后一次失败,立即再试,也许第二天晚上(不再等待3天)甚至更快,就像一个小时后(但在早上到达时停止重试)。很明显,cron不可能知道你的工作是否成功,而且这种模式也不能表达一种更频繁的替代方式"重试"时间表。
ANYWAY-- 你可以做自己想做的事。写一个脚本,告诉cron每天早上00:01运行它。此脚本可以检查记录"最后一次运行"的某些内容的时间戳,如果它是> 3天前**,则执行该作业并重置"最后一次运行"时间戳。
(*时间戳指示符是一个持久化状态,你可以操作和检查,但cron不能)
**如果您使用人类可读的时钟时间,请注意时间算术 - 一年两次,有些日子一天有23或25小时,02:00-02:59出现两次有一天或根本没有。使用UTC来避免这种情况。
答案 3 :(得分:6)
0 0 1-30/3 * *
这将从第1天开始每三天运行一次。以下是20个预定的运行 -
答案 4 :(得分:6)
答案 5 :(得分:3)
怎么样:
00 00 * * * every 3 days && echo test
every
是一个脚本:
#!/bin/sh
case $2 in
days)
expr `date +%j` % $1 = 0 > /dev/null
;;
weeks)
expr `date +%V` % $1 = 0 > /dev/null
;;
months)
expr `date +%m` % $1 = 0 > /dev/null
;;
esac
所以它每天都在运行。
使用*/3
在每月的第3日,第6日,第27日,第30日运行,但在一个月的第31天之后出现错误。 every
脚本在年底之后才会出错。
答案 6 :(得分:1)
如果您将其配置为仅运行,则会更简单在星期一和星期四,这将使它休息3天和4天。
否则将其配置为每天运行,但请尽早退出php cron脚本:
if (! (date("z") % 3)) {
exit;
}
答案 7 :(得分:1)
您应该学习crontab
的基础知识。
通过命令crontab -e
然后 ^(CTRL) + X 然后 Y 编辑cron,最后按在Mac上输入(返回)以保存文件。您可以检查已安装的新crons不是crontab -l
crontab文件有五个字段,用于指定分钟,小时,日期 月份,月份和星期几,然后是命令 在那个时间间隔运行。
* * * * * command to be executed
- - - - -
| | | | |
| | | | +----- day of week (0-6) (Sunday=0)
| | | +------- month (1-12)
| | +--------- day of month (1-31)
| +----------- hour (0-23)
+------------- min (0-59)
上面值字段中的 *
表示该列的大括号中的所有合法值。
在这里,我写了一篇关于它的详细帖子:Setup Cron in Unix
答案 8 :(得分:1)
我认为您没有所需的东西:
0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!
不幸的是,* / 3设置间隔为每月的每n天和不是 每隔n天。请参阅:explanation here。在月底,将保证有经常性问题。
1st at 2019-02-01 00:00:00
then at 2019-02-04 00:00:00 << 3 days, etc. OK
then at 2019-02-07 00:00:00
...
then at 2019-02-25 00:00:00
then at 2019-01-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...
根据this article,您需要向正在执行的命令添加一些模数学,以获取“每N天”为TRUE。例如:
0 0 * * * bash -c '(( $(date +\%s) / 86400 \% 3 == 0 )) && runmyjob.sh
在此示例中,将每天在12:00 AM检查该作业,但仅在自1970年1月1日以模3为天起的天数为0时执行。
如果希望从特定日期起每三天一次,请使用以下格式:
0 0 * * * bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh
答案 9 :(得分:0)
如果您希望它在该月的特定日期运行,例如第1天,第4天,第7天等,那么您可以在脚本中设置一个条件来检查当月的当天。
我认为你需要的只是* / 3而不是* / 3,这意味着每三天使用1/3,这意味着每月三天开始每三天一次。所以7/3意味着从每月7日开始每三天等等。
答案 10 :(得分:0)
0 0 * * * [ $(($((
日期+% - j - 1)) % 3)) == 0 ] && script
从date
获取一年中的某一天,偏移1,从0开始,检查它是否为模3。