每月第n个星期六的Linux crontab

时间:2019-03-30 10:29:42

标签: cron

除了周六,我喜欢在所有工作日进行跑步。 我的crontab条目

30 16 * * 1,2,3,4,5 ./backup.sh

此条目正常工作。 另外,我想在第1个,第3个星期六休息一下。 如果一个月内有可用的第5个Sutarday,则应运行备份。 crontab的条目将是什么?我在猜

30 16 1-7, 15-21, 29-31 * 6 ./backup.sh

我对吗?

1 个答案:

答案 0 :(得分:0)

  

我对吗?

不,您不正确。 crontab手册指出:

  

注意:可以在以下两个字段 month of week of 中指定命令的执行日期。如果两个字段都受限制(即不包含“ *”字符),则当两个字段中的任何一个与当前时间匹配时,该命令将运行。例如,   30 4 1,15 * 5将导致一个命令在每个月的1号和15号,以及每个星期五的凌晨4:30运行。

那我们该怎么做?

如果要确定是哪个月的星期六,即它是每月的第一个,第二个还是第三个星期六,您要做的就是查看星期六的工作日并进行以下整数计算:

D=$(date "+%d")
echo $(( (D-1)/7 + 1 ))

此值将返回相应的数字。这不仅适用于星期六,而且适用于任何工作日。

由于OP希望cron在第1个,第3个以及可能第5个星期六工作,所以实际上说该cron在每个奇数周六运行:

D=$(date "+%d")
echo $(( ((D-1)/7 + 1) % 2 ))

将此作为附加测试,可以使我们将cron编写为:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *   command to be executed

 30 16  *  *  6   (( (($(date "+\%d") - 1)/7 + 1) % 2 == 1 )) && command