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