Cron每三天工作一次

时间:2010-12-28 21:08:50

标签: cron

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

11 个答案:

答案 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个预定的运行 -

  • 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

答案 4 :(得分:6)

我不是专家,但是怎么样:

0 */72 * * *

每72小时不间断运行一次。

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

答案 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。