有没有办法安排不在每月第三个周末运行的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):

  • 创建一个cron作业,在需要时运行给定的脚本,忽略第三个周末部分
  • 制作一个在21和28上运行的cron作业,以将脚本切换到另一个no-op脚本

  • 虽然有点老套,但还是可以用的。

    将以下内容保存为
    /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