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

Nei*_*eil 11 cron crontab

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

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)


Ber*_*rtD 9

扩展@ 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可以看到整个命令.

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