除了周六,我喜欢在所有工作日进行跑步。 我的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
我对吗?
答案 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