Cron每三天工作一次

问题描述 投票:66回答:11

是否有可能每三天运行一次cronjob?或者每月10次。

cron
11个回答
100
投票

每三天运行一次......

0 0 */3 * *

那个怎么样?

如果您希望它在该月的特定日期运行,例如第1天,第4天,第7天等等,那么您可以在脚本中设置一个条件来检查当月的当天。

if (((date('j') - 1) % 3))
   exit();

或者,正如@mario指出的那样,您可以使用日期('k')来获取一年中的某一天,而不是根据月中的某天来完成。


0
投票

如果您希望它在该月的特定日期运行,例如第1天,第4天,第7天等等,那么您可以在脚本中设置一个条件来检查当月的当天。

我认为你需要的只是* / 3而不是* / 3,这意味着每三天使用1/3,这意味着每月三天开始每三天一次。所以7/3意味着从每月7日开始每三天等等。


0
投票

0 0 * * * [ $(($((date +% - j- 1)) % 3)) == 0 ] && script

date获取一年中的某一天,从0开始,从0开始,检查它是否为模3。


62
投票
* * */3 * *  that says, every minute of every hour on every three days. 

0 0 */3 * *  says at 00:00 (midnight) every three days.

12
投票

因为cron是“无状态的”,它不能准确地表达“频率”,只能表示它(显然)与当前时间不断匹配的“模式”。

改述你的问题会让这更加明显:“是否有可能在每晚00:01运行一个cronjob,除了在2晚内运​​行时跳过夜晚?”当cron将当前时间与作业请求时间模式进行比较时,cron无法知道它是否在过去运行您的工作。

(当然有可能编写一个记录过去作业的有状态cron,因此包括匹配此状态的模式,但这不是大多数操作系统中包含的标准cron。这样的系统会因为要求引入概念而变得复杂。当这样的模式“重置”时。例如,当时间改变时模式是否重置(即修改了crontab条目)?查看您最喜欢的日历应用程序,看看它能表达多少复杂的预定事件的重复模式,以及请注意,他们没有重置问题,因为起始日历事件具有自然的“开始”a / k /“重置”日期。请尝试重新安排每隔一周的重复日历事件,以推迟一周,过圣诞节例如。通常你必须终止那个反复出现的事件并重新启动一个全新的事件;这说明即使复杂的日历应用程序代表重复模式的表达方式也有限。当然,日历也有很多状态 - 每个单独的事件可以独立删除或重新安排[在大多数日历应用程序中])。

此外,如果成功,您可能希望每隔3晚完成一次工作,但如果最后一次失败,请立即重试,也许第二天晚上(不要再等3天)或更快,比如一小时后(但停止重试)在早上到达)。很明显,cron不可能知道你的工作是否成功,而且这种模式也不能表达另一种更频繁的“重试”时间表。

无论如何 - 你可以做自己想做的事。写一个脚本,告诉cron每天早上00:01运行它。此脚本可以检查记录“上次运行”的*的时间戳,如果> 3天前**,则执行作业并重置“上次运行”时间戳。

(*时间戳指示符是一些持久状态,你可以操作和检查,但cron不能)

**如果你使用人类可读的时钟时间,请注意时间算术 - 一年两次,有些日子一天有23或25小时,02:00-02:59在一天内发生两次或不在所有。使用UTC来避免这种情况。


10
投票

我不是专家,但如何:

0 */72 * * *

它将每72小时运行一次,不会中断。

https://crontab.guru/#0_/72___


7
投票
0 0 1-30/3 * *

这将从第1天开始每三天运行一次。这是20个预定的运行 -

  • 2015-06-01 00:00:00
  • 2015-06-04 00:00:00
  • 2015-06-07 00:00:00
  • 2015-06-10 00:00:00
  • 2015-06-13 00:00:00
  • 2015-06-16 00:00:00
  • 2015-06-19 00:00:00
  • 2015-06-22 00:00:00
  • 2015-06-25 00:00:00
  • 2015-06-28 00:00:00
  • 2015-07-01 00:00:00
  • 2015-07-04 00:00:00
  • 2015-07-07 00:00:00
  • 2015-07-10 00:00:00
  • 2015-07-13 00:00:00
  • 2015-07-16 00:00:00
  • 2015-07-19 00:00:00
  • 2015-07-22 00:00:00
  • 2015-07-25 00:00:00
  • 2015-07-28 00:00:00

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脚本在年底之后才错误。


2
投票

你应该学习crontab的基础知识。

通过命令crontab -e然后^(CTRL)+ X然后Y编辑cron,最后在Mac上按ENTER(返回)以保存文件。您可以检查已安装的新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


2
投票

我不认为你有你需要的东西:

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检查作业,但仅在自01-01-1970模3的天数为0时执行。

如果您希望从特定日期开始每3天使用一次,请使用以下格式:

0 0 * * *  bash -c '(( $(date +\%s -d "2019-01-01") / 86400 \% 3 == 0 )) && runmyjob.sh

1
投票

如果您将其配置为仅运行,例如,它会更简单在星期一和星期四,这将给它一个3天和4天的休息时间。

否则将其配置为每天运行,但要提前退出php cron脚本:

if (! (date("z") % 3)) {
     exit;
}
© www.soinside.com 2019 - 2024. All rights reserved.