如何指导cron每两周执行一次工作?

tko*_*zka 61 unix linux cron scheduling

我想通过cron运行一个工作,这个工作将在每天的特定时间每两周执行一次.每周二都很容易:

0 6 * * Tue
Run Code Online (Sandbox Code Playgroud)

但是如何在"每隔一个星期二"(或者如果你愿意 - 每隔一周)制作它?我不想在它自己的脚本中实现任何逻辑,但只保留在cron中的定义.

pil*_*row 45

回答

修改您的星期二cron逻辑,以便自纪元以来每隔一周执行一次.

知道一周有604800秒(忽略DST更改和闰秒,谢谢),并使用GNU日期:

0 6 * * Tue expr `date +\%s` / 604800 \% 2 >/dev/null || /scripts/fortnightly.sh
Run Code Online (Sandbox Code Playgroud)

在旁边

日历算术很令人沮丧.

@ xahtep的答案非常棒,但正如@Doppelganger在评论中指出的那样,它会在某些年份的界限上失败.该date实用程序的"一年中的一周"说明符都不能在这里提供帮助.1月初的某个星期二将不可避免地重复前一年最后一个星期二的周平价:2016-01-05(%V),2018-01-02(%U)和2019-01-01(%W) .


xah*_*tep 44

怎么样,crontab即使它没有在前五个字段中精确定义,它确实保持在它:

0 6 * * Tue expr `date +\%W` \% 2 > /dev/null || /scripts/fortnightly.sh
Run Code Online (Sandbox Code Playgroud)

  • 我的猜测是这个解决方案在一年的最后一周有问题.有时一年的最后一个星期五是第51周,有些时候是第52周.所以这可能会让你连续两周或三周一次 (7认同)

Han*_*ans 11

也许有点愚蠢,但也可以创建两个 cronjobs,每个第一个星期二一个,每个第三个一个。

第一个定时任务:

0 0 8 ? 1/1 TUE#1 *
Run Code Online (Sandbox Code Playgroud)

第二个定时任务:

0 0 8 ? 1/1 TUE#3 *
Run Code Online (Sandbox Code Playgroud)

不确定这里的语法,我使用http://www.cronmaker.com/来制作这些。

  • 将作业安排在每月的第一个和第三个星期二将会错过该月的第五个星期二(例如,2015 年 3 月 31 日),当然添加第五个星期二会过于频繁地运行作业。另外,这个答案引用了类似 cron 的 [Quartz 调度程序](http://stackoverflow.com/questions/tagged/quartz-scheduler),而不是传统的 *NIX cron。 (4认同)

小智 11

就像是

0 0 1-7,15-21 * 2
Run Code Online (Sandbox Code Playgroud)

将在该月的第一个和第三个星期二进行。

注意:不要将其与 vixie cron(包含在 RedHat 和 SLES 发行版中)一起使用,因为它会在月份日期和星期几字段之间创建 or,而不是 and。

  • 一些发行版可以运行,而有些则不能运行,有哪些示例?因为当你用“man cron”阅读手册页时,Ubuntu 和 Mac OSX 都会说“vixie cron”。你提到“不要与..RedHat一起使用”。如果标准是 vixie 这个词,那就排除了一切。也许这并不是要检查的事情。 (2认同)

小智 8

pilcrow的答案很棒.然而,这导致每运行fortnightly.sh脚本甚至一周(自纪元).如果您需要在奇数周运行脚本,您可以稍微调整一下他的答案:

0 6 * * Tue expr \( `date +\%s` / 604800 + 1 \) \% 2 > /dev/null || /scripts/fortnightly.sh
Run Code Online (Sandbox Code Playgroud)

将1更改为0会将其移回甚至数周.