pax*_*blo 22
本月的第二个星期六是从8 日到14 日的一个(也是唯一一个)日期.同样地,第四星期六落在一个 22之间日期次和28 次以下.
您可能认为可以使用星期几字段将其限制为星期六(6在下面的行中):
0 1 8-14,22-28 * 6 /path/to/myscript
Run Code Online (Sandbox Code Playgroud)
不幸的是,根据联机帮助页,日期和星期几是OR命题,其中任何一个都会导致作业运行:
cron当分钟,小时和月份字段与当前时间匹配时,以及当两天字段(月中的某天或星期几)中的至少一个与当前时间匹配时,执行命令.命令执行的日期可以由两个字段指定 - 月中的某天和星期几.如果两个字段都受限制(即,不是*),则当任一字段与当前时间匹配时,将运行该命令.例如,
30 4 1,15 * 5会导致命令在每个月的1日和15日凌晨4:30以及每个星期五运行.
因此,您需要将工作设置cron为在每一天运行,如果不是星期六,则立即退出.
因此,cron条目是:
0 1 8-14,22-28 * * /path/to/myscript
Run Code Online (Sandbox Code Playgroud)
(每天凌晨1点运行).
然后,在顶部/path/to/myscript,放:
# Exit unless Saturday
if [[ $(date +%u) -ne 6 ]] ; then
exit
fi
Run Code Online (Sandbox Code Playgroud)
而且,如果你不能修改脚本(例如,如果它是一个程序),只需编写一个脚本,只包含该检查和对该程序的调用,然后从中运行cron.
您还可以将星期六的测试放入crontab文件本身,以将调度数据保存在一个位置:
0 1 8-14,22-28 * * [ `date +\%u` = 6 ] && /path/to/myscript
Run Code Online (Sandbox Code Playgroud)
扩展@ paxdiablo的回复,为什么不把这个添加到crontab而不是脚本?
#m h dom mon dow command
0 1 8-14,22-28 * * [ `date +\%u` = 6 ] && /path/to/myscript
Run Code Online (Sandbox Code Playgroud)
请注意%u之前的反斜杠,在命令行上尝试此操作时不需要,但在crontab条目中需要它以确保shell可以看到整个命令.
这样做可以让所有逻辑在同事首次查看的地方选择正确的日期,并且如果需要,您可以在另一天手动运行脚本.