Cron每三天工作一次

tma*_*314 78 cron

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

sbe*_*rry 107

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

0 0 */3 * *
Run Code Online (Sandbox Code Playgroud)

那个怎么样?

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

if (((date('j') - 1) % 3))
   exit();
Run Code Online (Sandbox Code Playgroud)

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

  • 答案是不正确的,因为这两个建议实际上每3天都没有.`0 0*/3**`表示在1日,4日,7日等运行.(`*/3`表示'1-31/3`表示'1,4,7 ... 31`)所以月末的差距将会缩小.(如果前一个月有31天,它将连续运行2天.)`date('j')%3`有类似的问题,因为模式每年都会重新启动,而且几年没有数字可被3整除的日子. (8认同)
  • 我也很体贴不幸的是,这被认为是答案.我真的在寻找每N天,不管月份的界限(像植物这样的东西不关心他们每月的哪一天得到他们的水).至少我认为在阅读完所有评论后我决定,cron计时器本身并不能完全模拟这种愿望. (7认同)
  • @whatshakin:这取决于你每隔三天想要的准确度.这将适用于可被3整除的任何一天.在月份边界上,它将不准确. (5认同)
  • 这是谷歌的一个非常高的结果,因此如果接受的答案是正确的会更好,但事实并非如此。我相信 Tareco 的解释是正确的。 (4认同)
  • @whatshakin:甚至在维基百科上描述了cronjob语法:http://en.wikipedia.org/wiki/Cronjob (3认同)

小智 63

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

0 0 */3 * *  says at 00:00 (midnight) every three days.
Run Code Online (Sandbox Code Playgroud)

  • 这通常每三天触发一次,但可以在月初的第二天触发 (5认同)

Fab*_*sco 15

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

0 */72 * * *
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我测试了这个。它每天都在运行。 (10认同)
  • 根据 [crontab.guru](https://crontab.guru/#0_*/72_*_*_*) 这每天都会运行。谁是对的? (5认同)
  • 这比公认的解决方案更准确。更改月份时接受的答案将失败:`then at 2019-02-28 00:00:00 then at 2019-03-01 00:00:00` (4认同)
  • 根据 [crontab.guru](https://crontab.guru/#0_%2A/72_%2A_%2A_%2A) 和 [man crontab](https:// /ss64.com/bash/crontab.html)。 (4认同)
  • */72 实际上与 0 相同。它在每个午夜运行。 (3认同)

小智 14

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

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

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

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

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

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

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


小智 11

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

0 0 */3 * * ## <<< WARNING!!! CAUSES UNEVEN INTERVALS AT END OF MONTH!!
Run Code Online (Sandbox Code Playgroud)

不幸的是, */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-02-28 00:00:00
then at 2019-03-01 00:00:00 << 1 day WRONG
then at 2019-03-04 00:00:00
...
Run Code Online (Sandbox Code Playgroud)

根据这篇文章,您需要向正在执行的命令添加一些模数运算,以获得“每 N 天”的 TRUE。例如:

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

在此示例中,作业将在每天上午 12:00 进行检查,但仅在自 01-01-1970 模 3 以来的天数为 0 时才会执行。

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

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

  • 这并不完全正确。将“-d”与“+s”结合使用,可以得到从纪元到“-d”指定的日期所经过的秒数。无论当天是哪一天,算术表达式的计算结果始终相同。更准确的计算是使用“+s -d”变体并存储自纪元(“+s”)以来经过的秒数,然后取差值并除以 86400 以获得该天数自开始日期以来已过去。您可以在之后应用模数运算符。值得称赞的是,这是迄今为止最正确的答案。 (2认同)

Vis*_*hal 7

0 0 1-30/3 * *
Run Code Online (Sandbox Code Playgroud)

这将从第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

  • 2015-07-31 00:00:00,2015-08-01 00:00:00 ... OOPS运行之间仅1天 (4认同)