如何安排每两周一次的cronjob?


10

crontab(5)定义了以下字段:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

并说明:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

因此,据我所知,没有双周刊的乔布斯。我很确定有解决方法,您有什么办法?还是我错过了什么?


2
我可以在这里找到最好的答案:unix.stackexchange.com/questions/1224/…–
Somantra

...关于U&L的那些答案将是我这样做的方式,@ Somantra :-)
voretaq7

@ voretaq7,我曾经说过这是规范的答案,但我不想作为学究的人来见;-)
Somantra 2012年

Answers:


8

您可以在每个星期三让cron运行该程序,然后运行该程序确定是偶数周还是奇数周。例如:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi

这是一个很好的解决方案,但是,它本身并不能真正回答问题-我宁愿不要使用计划逻辑来污染问题。也许我可以将其与@Somantra提供的链接集成在一起。
罗马

好吧,我必须承认:这是迄今为止最好的解决方案。@Somantra提供的链接可以达到相同的结果,而不必要的是复杂的IMHO(以UNIX时间计),但是以相同的样式将您的方法直接添加到cronjob(而不是添加到脚本中)会使它非常优雅。
罗马

这在2020年中断,因为它有53周。例如:如果您的Cron计划于12月31日每两周运行一次,那么它将在2020年12月31日(第53周)和2020年1月4日(第一周)运行。
mad_fox

4

支持范围很多(您没有指定要使用的选项)。所以像

0 0 1-7,15-21 * 3

会在每月的第一和第三周三。


这比“在脚本中执行此操作”方法稍微好一点,但是请记住在crontab中添加一条注释(一般经验法则:如果您有一个-以上或/涉及其中,则可能值得注释以描述时间表)
voretaq7

我怀疑这是错误的;它将导致该作业在每个月的1号至7号以及15号至21号以及每个星期三运行。来自man 5 crontab以下内容的命令:“ 命令的执行日期可以由两个字段指定-月份的日期和星期几。如果两个字段都受到限制(即不是*),则当两个字段中的任何一个与例如,“ 30 4 1,15 * 5”将导致一个命令在每个月的1号和15号的凌晨4:30加上“每个星期五 ”运行(我强调)。
MadHatter 2014年

1
实际上,这取决于您使用的是哪个cron守护程序。您的输入似乎来自vixie cron(包含在RedHat发行版中)。在dillo的cron(Slackware)上的“ man crontab”中:如果您同时指定一个月中的某天和一周中的某天,则*将被解释为该月的第N个此类天*。尽管如此,脚本化的解决方案(计算周数)看起来像是唯一的便携式解决方案。
AlvaroGMJ 2015年

2

对于需要每隔一周运行一次的东西,请使用此一线:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

该特定脚本计划在星期五运行。可以使用“ -eq 0”或“ -eq 1”来调整要执行的星期


1

Anacron是解决cron局限性的好方法。

  • Anacron具有“ 重复周期”参数,您可以将其设置为14。

周期延迟作业标识符命令

14 15 test.daily /path/to/script.sh


不幸的是,不能使用anacron。忘了说。
罗马

1

如果您的需求不是每两周一次,那么您可以在每月的1号和15号简单地运行cronjob:

15 8 1,15 * * /your/script.sh

每月的第一天和第十五天的上午8:15运行,与星期几无关。


-2

从该说明中,在周字段中设置3/2应该在其他每个星期三运行任务-它是隐式的,但我认为是可行的。


不,这相当于for(int i=3; i <=3 ; i+=2) {} ,因为它只有通过这种一次去,不要紧,如果“步”是1或2

@stew说了什么。另外,没有“星期字段”。
罗马

“星期几”是指“星期几”
Journeyman Geek
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.