【问题标题】:schedule a cron job to run on 1st, 2nd, and 3rd tuesday of every month安排一个 cron 作业在每个月的第一个、第二个和第三个星期二运行
【发布时间】:2012-11-27 21:27:40
【问题描述】:

在为我拥有的三个脚本设置 cron 计划时,我希望能得到一些帮助。我需要安排第一个脚本在每个月的第一个星期二运行,第二个脚本在每个月的第二个星期二运行,第三个脚本在每个月的第三个星期二运行。这是我目前所拥有的。

# Run first script on the 1st Tuesday of every month at 9:00 AM
0 9 1,2,3,4,5,6,7 * 2 wget -q -O /dev/null http://site.com/first-script

# Run second script on the 2nd Tuesday of every month at 9:00 AM
0 9 8,9,10,11,12,13,14 * 2 wget -q -O /dev/null http://site.com/second-script

# Run third script on the 3rd Tuesday of every month at 7:00 AM
0 7 15,16,17,18,19,20,21 * 2 wget -q -O /dev/null http://site.com/third-script

我相信这些脚本将在每个月的第一个、第二个和第三个星期二以及每个月的 1-21 日运行。看起来从我读到的星期几和天是一个 AND,这是真的吗?

希望这可以通过 cron 实现,否则我将不得不改变是否在脚本内部运行脚本的决定。

【问题讨论】:

    标签: cron crontab


    【解决方案1】:

    如果您不想将日期检查逻辑直接放入脚本中,您可以让 cron 作业 shell 命令 部分在执行脚本之前检查星期几和条件。

    # Run first script on the 1st Tuesday of every month at 9:00 AM
    0  9  1-7    *  *  [ "$(date '+\%a')" = "Tue" ] && wget -q -O /dev/null http://example.com/first-script
    
    # Run second script on the 2nd Tuesday of every month at 9:00 AM
    0  9  8-14   *  *  [ "$(date '+\%a')" = "Tue" ] && wget -q -O /dev/null http://example.com/second-script
    
    # Run third script on the 3rd Tuesday of every month at 7:00 AM
    0  7  15-21  *  *  [ "$(date '+\%a')" = "Tue" ] && wget -q -O /dev/null http://example.com/third-script
    

    如果 [ $(date '+\%a')" = "Tue" ] 条件成功,脚本将执行。% 符号必须用反斜杠转义,因为 cron 处理 %作为特殊字符。

    因为一周有 7 天,所以保证每月的第一个星期二在 1-7 范围内,第二个在 8-14 范围内,第三个在 15-21 范围内。

    要捕捉第一个星期二,您不能这样做:

    0  9  1-7  *  2 && wget -q -O /dev/null http://example.com/some-script
    

    ...因为 1-7(星期几)和 2(星期几)实际上是 OR'd。由于某种原因,Cron 对这两个字段的处理方式与其他字段不同。在上面的示例中,您的脚本最终将在 1-7 范围内每天运行,AND每周二。

    【讨论】:

      【解决方案2】:

      您可以将 cron 设置为:

      00 09 1-7,8-14,15-21 * 2 /path/myscript

      这将在第一、第二和第三个星期二的上午 9 点运行脚本。

      【讨论】:

        【解决方案3】:

        另一种方法是创建 ma​​in-script 以在每个星期二运行,验证是否是星期二,并且该小时相应地调用适当的辅助脚本。

        0 7,9 * * 2 wget -q -O /dev/null http://site.com/main-script
        

        希望对你有帮助。

        您好。

        【讨论】:

        • 酷,谢谢。我想我会将逻辑转移到 PHP 主脚本中确定每月的哪个星期二,并按照您的建议简单地安排一个 cron 在每个星期二运行。谢谢!
        【解决方案4】:

        他们是 OR。

        它将在每个星期二在列出的日期运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-07
          • 1970-01-01
          相关资源
          最近更新 更多