每个月的第2个和第4个星期六运行

时间:2012-07-27 07:36:06

标签: cron crontab

在本月的第2个和第4个星期六运行作业的cron(linux)语法是什么?

5 个答案:

答案 0 :(得分:17)

本月的第二个星期六是从8 th 到14 th 的一个(也是唯一一个)日期。同样地,第四个星期六落在22 nd 和28 th 之间的一个日期。

您可能认为可以使用星期几字段将其限制为星期六(下面一行中的6):

0 1 8-14,22-28 * 6 /path/to/myscript

不幸的是,根据联机帮助页, 将导致作业运行,因此日期和星期几是OR命题:

  

当分钟,小时和月份字段与当前时间匹配时,cron执行命令,当两个天字段中的至少一个时(月份,或者星期几)匹配当前时间。

     

命令执行的日期可以由两个字段指定 - 月中的某天和星期几。如果两个字段都受到限制(即,不是*),则当任一字段与当前时间匹配时,将运行该命令。例如,30 4 1,15 * 5会导致命令在每个月的1日和15日凌晨4:30以及每个星期五运行。

因此,您需要将cron作业设置为每天都运行,如果不是星期六则立即退出。

cron条目是:

0 1 8-14,22-28 * * /path/to/myscript

(每天凌晨1点运行)。

然后,在/path/to/myscript的顶部,输入:

# Exit unless Saturday
if [[ $(date +%u) -ne 6 ]] ; then
    exit
fi

并且,如果你不能修改脚本(例如,如果它是一个程序),只需编写一个脚本,只包含该检查和对该程序的调用,并从{{ 1}}而不是。

您还可以将星期六的测试放入cron文件本身,以便将调度数据保存在一个位置:

crontab

答案 1 :(得分:9)

扩展@ paxdiablo的回复,为什么不将加法放入crontab而不是脚本?

#m h dom       mon dow command
0  1 8-14,22-28 *   *   [ `date +\%u` = 6 ] && /path/to/myscript

注意%u之前的反斜杠,在命令行上尝试时不需要,但在crontab条目中需要它以确保shell能够看到整个命令。

这样做可以让所有逻辑在同事首次看到的地方选择正确的日期,并且如果需要,您可以在另一天手动运行脚本。

答案 2 :(得分:2)

如果有两份工作

0 0 0 ? * 7#2
0 0 0 ? * 7#4

第一个给出

2015-12-12 00:00:00 (-08:00)
2016-01-09 00:00:00 (-08:00)
2016-02-13 00:00:00 (-08:00)
2016-03-12 00:00:00 (-08:00)
2016-04-09 00:00:00 (-07:00)

第二个给出了

2015-11-28 00:00:00 (-08:00)
2015-12-26 00:00:00 (-08:00)
2016-01-23 00:00:00 (-08:00)
2016-02-27 00:00:00 (-08:00)
2016-03-26 00:00:00 (-07:00)

答案 3 :(得分:1)

上述解决方案效果很好。另外,我有一个更复杂的挑战,我有多套脚本,每组都依赖于另一组。第一组脚本必须在本月的第3个星期日运行。本月第3个星期日之后的星期一的第2套脚本,依此类推。基于上述解决方案,我提出的解决方案如下:

第3个星期天日期15-21。

星期一在第3个星期日之后的日期16-22。

星期二在第3个星期日之后的17-23日。

其他日期范围与第一组脚本(即触发脚本)的天数差异抵消。

答案 4 :(得分:0)

如果您有可用的,可以使用 ncal 来获取第一列中带有日期名称的日历,您可以在该日历中查看星期几,以获取该日的当月日期:

    August 2012
Su     5 12 19 26
Mo     6 13 20 27
Tu     7 14 21 28
We  1  8 15 22 29
Th  2  9 16 23 30
Fr  3 10 17 24 31
Sa  4 11 18 25

如果星期六支持 grep ,那么您将获得一个月份日期为星期六的行。如果您使用 awk 解析特定列(awk'{print($ 3)}'为“第二个”星期六而awk'{print($ 5)}'为第四个星期六)并比较到今天的日期(日期+%e),那么你就会知道脚本是否需要运行。

然后,您可以围绕此构建脚本,并将其链接在一个在星期六运行的crontab条目中。因此,当它在星期六运行时,如果日期等于第二或第四个星期六,请彻底退出,然后使用&&在此脚本之后的crontab条目中运行实际作业。但如果它是第1或第3个星期六,退出1然后&&不会运行这份工作。 (你会收到一封错误的电子邮件,说它没有完成或其他什么)