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

Rom*_*man 12 cron

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)
Run Code Online (Sandbox Code Playgroud)

并解释说:

 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'').
Run Code Online (Sandbox Code Playgroud)

所以,就我的理解而言,没有双周刊。我很确定有解决方法,你的是什么?还是我错过了什么?

qua*_*cky 9

许多 cron(您没有指定您使用的是哪个)支持范围。所以像

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

将达到本月的第一个和第三个星期三。

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

  • 我怀疑这是错误的;它将导致作业在每月 1 日至 7 日、15 日至 21 日以及每周三**和**运行。来自`man 5 crontab`:“*命令执行的日期可以由两个字段指定 - 一个月中的一天和一周中的一天。如果这两个字段都受到限制(即不是 * ),则该命令将是当**任一**字段与当前时间匹配时运行。例如,“30 4 1,15 * 5”将导致命令在每月 1 号和 15 号以及每个星期五的凌晨 4:30 运行“(我的强调)。 (2认同)
  • 实际上,这取决于您使用的 cron 守护进程。您的条目似乎来自 vixie cron(包含在 RedHat 发行版中)。来自 dillo 的 cron (Slackware) 上的“man crontab”:_如果您同时指定一个月中的某一天和一周中的某一天,*它将被解释为该月中的第 N 个这样的日子*。_仍然是一个脚本化解决方案(计算周数)看起来是唯一的便携式解决方案。 (2认同)

ste*_*tew 9

您可以在每个星期三让 cron 运行该事物,然后让该事物运行来决定它是偶数周还是奇数周。例如:

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


小智 1

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

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

周期延迟作业标识符命令

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