有没有办法安排不在每月第三个周末运行的cron作业?
任何人有什么想法吗?在第一、第二、第四个周末(可能是第五个周末)运行它有没有办法安排不在每月第三个周末运行的cron作业?,cron,posix,Cron,Posix,任何人有什么想法吗?在第一、第二、第四个周末(可能是第五个周末)运行它 # m h dom mon dow command * * 1-20,28-31 * 0 echo #test 我不知道它是每天都会运行,还是只在周日(第0天)运行,但它不会在第21到27天(第三周)运行。如果是第三周(或者不是星期天),在脚本中添加一个复选框可能非常简单。如果希望在除第三周以外的任何可能的星期六运行脚本(请尝试3): 创建一个cron作业,在需要时运行给定的脚本,忽略第三个周
# m h dom mon dow command
* * 1-20,28-31 * 0 echo #test
我不知道它是每天都会运行,还是只在周日(第0天)运行,但它不会在第21到27天(第三周)运行。如果是第三周(或者不是星期天),在脚本中添加一个复选框可能非常简单。如果希望在除第三周以外的任何可能的星期六运行脚本(请尝试3):
虽然有点老套,但还是可以用的。将以下内容保存为
/usr/local/bin/is\u third\u week\u month.sh
或其他地方
#!/bin/bash
if [ $# != 3 ]
then
echo "Usage: $0 <yyyy> <mm> <dd>" 1>&2
exit 127
fi
YEAR=$1
MONTH=$2
DAY=$3
FIRST_WEEK_IN_MONTH=`date +%V -d $YEAR-$MONTH-01`
WEEK_FOR_DAY=`date +%V -d $YEAR-$MONTH-$DAY`
DIFF=$(($WEEK_FOR_DAY - $FIRST_WEEK_IN_MONTH))
if [ $DIFF = 2 ]
then
# this is the third week
exit 0
else
exit 1
fi
或者,如果希望crontab中只有一行,也可以修改脚本以检查日期。这实际上不起作用(至少在vixie cron中不起作用)。这将导致脚本在第1-20天、第28-31天和每个星期日运行。当dom和dow被指定时,脚本会在任何一个条件成功时运行。我的观点是正确的-但是在脚本中检查“not sunday,so exit”可以解决这个问题。再说一次,每个星期天运行它,如果是21-27号就退出。这实际上不起作用(至少在vixie cron上不起作用)。这将导致脚本在第1-13天、第21-31天和每周六运行。当指定了月日和星期日时,脚本将在任一条件成功时运行。感谢您指出这一点。我没有意识到最后两列是OR而不是AND。每天学习新的东西!您希望它每天都运行而不是第三个周末的一部分,还是希望它每个周末都运行而不是第三个周末?如果月份从星期一开始,那是第一个周末吗?在我的系统上,date+%V为一位数的周数打印一个前导零。这使得$DIFF的计算认为它有八进制值,并且失败了。例如,尝试在2009 02 19中运行此脚本。去掉前导零,如下所示:第一个月中的周=
日期+%V-d$YEAR-$MONTH-01 sed s/^0/
——下一行中的周=日=日期+%V-d$YEAR-$MONTH-$DAY | sed s/^0/
此外,1月1日的ISO周数(%V)可以是52(如2006年)或53(如2005年)这可能会导致th$DIFF计算为负数,并且无法找到1月份的第3周。因此,您应该将“%V”s更改为“%W”,它总是在第0周或第1周开始一年,在第52周或第53周结束一年(%V可以在第52周、第53周或第1周结束一年)。
#!/bin/bash
if [ $# != 3 ]
then
echo "Usage: $0 <yyyy> <mm> <dd>" 1>&2
exit 127
fi
YEAR=$1
MONTH=$2
DAY=$3
FIRST_WEEK_IN_MONTH=`date +%V -d $YEAR-$MONTH-01`
WEEK_FOR_DAY=`date +%V -d $YEAR-$MONTH-$DAY`
DIFF=$(($WEEK_FOR_DAY - $FIRST_WEEK_IN_MONTH))
if [ $DIFF = 2 ]
then
# this is the third week
exit 0
else
exit 1
fi
12 00 * * 1,2,3,4,5 your_command
12 00 * * 6,7 test ! /usr/local/bin/is_third_week_in_month.sh `date "+%Y %m %d"` && your_command