每三天进行一次Cron工作


93

每三天可以进行一次cronjob吗?或每月10次。


4
是的,这是可能的,并且属于SuperUser。

anacron可以每3天运行一次,而不管月边界如何。
ryanpattison

Answers:


125

每三天运行一次...

0 0 */3 * *

那个怎么样?

如果您希望它在每月的特定日期(例如1号,4号,7号等)运行,那么您可以在脚本中添加一个条件来检查该月的当前日期。

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

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


9
@whatshakin:这取决于您希望“每三天”的准确性。这将在可被3整除的任何一天工作。
大卫2010年

3
@whatshakin:cronjob语法甚至在Wikipedia上也有描述:en.wikipedia.org/wiki/Cronjob
Felix Kling 2010年

4
这在google上是很高的结果,因此,如果接受的答案是正确的,那会更好,而事实并非如此。我相信塔雷科的解释是正确的。
lynks 2012年

14
答案是不正确的,因为没有任何建议实际上每3天运行一次。 0 0 */3 * *装置在第一,第四,第七等(运行*/3装置1-31/3的装置1,4,7...31),所以该间隙将在月底小。(它会连续运行2个天,如果前一个月有31天。)将date('j') % 3在该模式重新启动每年都有类似的问题,以及多年没有天数的整除3
CJM

8
我也很遗憾这被接受为答案。我真的在每隔N天寻找一次,而不管月份的界限如何(像植物这样的事物不在乎它们在哪个月的哪一天得到水)。至少我认为在阅读所有评论之后,我确定了cron计时器本身并不能完全建模该需求。
特拉维斯·格里格斯

69
* * */3 * *  that says, every minute of every hour on every three days. 

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

欣赏的解释
pythonian29033

2
这通常每三天触发一次,但可以在一个月初的第二天触发
Dziamid

24

我不是cron专家,但是如何:

0 */72 * * *

它将每72小时不间断运行。

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


3
这比公认的解决方案更准确。更改月份后,可接受的答案将失败:then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00
山本彰(Akira Yamamoto)

如何计算何时发生?
Bruce Edge

2
crontab.guru称,它每天运行。谁是对的?
velop

1
根据crontab.guruman crontab,小时列中的值必须介于0到23之间。
哈珀维尔

1
* / 72实际上等于0。它每隔午夜运行一次。
battey

19

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

改写您的问题将使这一点更加明显:“是否有可能每天晚上00:01运行cronjob,但在2夜之内运行跳过夜除外?” 当cron将当前时间与工作请求时间模式进行比较时,cron无法知道它过去是否执行了您的工作。

通常,您必须终止该重复发生的事件并重新启动一个全新的事件。这说明了复杂的日历应用程序如何表示重复模式的有限的表达能力。当然,日历有很多状态-每个事件都可以[在大多数日历应用中]单独删除或重新安排。

此外,如果成功,您可能希望每3晚进行一次工作,但是如果最后一个失败,请立即重试,也许是第二天晚上(不要再等3天),甚至更快,例如一个小时后(但是请停止重试)早上到达时)。显然,cron无法知道您的工作是否成功,并且模式也无法表示出更频繁的“重试”时间表。

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

(*带时间戳记的指示器是一些持久状态,您可以操纵和检查它,但cron不能)

**如果您使用人类可读的时钟时间,请谨慎使用时间算法-一年两次,某些日子一天有23或25个小时,而一天中的02:00-02:59一天出现两次或不在所有。使用UTC可以避免这种情况。


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

5
2015-07-31
00:00:00,2015-08-01

4

我认为您没有所需的东西:

0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!

不幸的是,* / 3 在每个月的n天不是 n天设置间隔。请参阅:此处的说明。在月底,将保证有经常性问题。

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
...

根据本文的介绍,您需要向正在执行的命令中添加一些模数学以获取“每N天”为TRUE。例如:

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

在此示例中,将每天在12:00 AM检查该作业,但仅在自1970年1月1日以模3为天的天数后才执行。

如果希望从特定日期起每三天一次,请使用以下格式:

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

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


3

您应该学习的基础知识crontab

按命令编辑cron crontab -e,然后按⌃ (CTRL)+,X然后Y最后ENTER (return)在mac上按保存文件。您可以检查不是通过安装新的克隆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)

* 上方“值”字段中的表示该列大括号中的所有合法值。

在这里,我写了一篇详细的文章:在Unix中安装Cron


1

如果将其配置为仅在星期一和星期四运行,这将更加简单,这将使其有3天和4天的休息时间。

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

if (! (date("z") % 3)) {
     exit;
}

0

如果您希望它在每月的特定日期(例如1号,4号,7号等)运行,那么您可以在脚本中添加一个条件来检查该月的当前日期。

我以为您需要的不是* / 3,而是每三天一次,而是1/3,这意味着从本月1日开始每三天一次。因此7/3表示从该月的7号开始每三天,依此类推。


0

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

从中获取一年中的日期,将其date偏移1以从0开始,检查是否为模3。


从非-年过渡到下一年时,这不会打h,( 365-1 ) % 3 == 1但是 ( 1 - 1 ) % 3 == 0吗?我认为更好的计算将基于自Unix纪元以来的天数。
kmoser
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.