【问题标题】:How to schedule a cron for the first Thursday of every month如何在每个月的第一个星期四安排 cron
【发布时间】:2022-05-03 16:54:34
【问题描述】:

我需要安排一个 cron 作业在每个月的第一个星期四下午 3:00 运行。我怎样才能做到这一点? 我读过另一个与此类似的主题,但它是每个月的第一个星期日。如何修改它以满足我的需要?请不要让我参考任何手册,因为它们对我没有帮助。这就是我在这里问这个问题的原因。

每个月的第一个星期日

00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script

这里应该做一个简单的回答,我只是不知道-le 07 代表什么。

所以 4 是星期四,cron 中的 -le 07 是什么?

是每月第 7 天(星期日)的支票吗?

00 15 * * 4 [ $(date +\%d) -le 07 ] && /run/your/script

还是应该是这个?

假设这是本月第 4 天(星期四)的支票?

00 15 * * 4 [ $(date +\%d) -le 04 ] && /run/your/script

由于英语不是我的母语,我希望这对你们来说尽可能清楚。

提前致谢。

【问题讨论】:

  • 为什么我在这个网站上发现了同样的问题,但在星期天?

标签: linux cron


【解决方案1】:

答案:

0 15 * * 4 [ $(date +\%d) -le 7 ] && command

解释:

首先,您需要意识到,每月的第一个星期四总是有一个日期在集合{1,2,3,4,5,6,7} 中。那是因为一周只有7天。因此,第一个星期四不能有大于 7 的一天。显然,对于任何其他工作日(例如星期二或星期六)也是如此。

cron 将执行的命令由两部分组成:

  • [ $(date "+\%d") -le 7 ]: 这是一个简单的测试,检查一个月中的某天是否小于 7。它基本上检查我们是否在该月的第一周。命令 date -d "+%d" 以两位数 (01,02,03,...,31) 的形式返回月份中的日期,并且是一个字符串。 test 命令,这里用方括号[ ... ] 的替代形式编写,检查来自date 的整数是否小于或等于7。您可以在键入man test 时阅读更多信息在终端中。

  • command: 如果前面的test 成功,这是要执行的命令。 IE。如果我们在本月的第一周。只有在test 命令成功的情况下才会执行它的原因是因为&&cmd1 && cmd2 形式的命令将执行 cmd1,只有当该命令成功时,它才会执行 cmd2

既然我们现在有了命令,我们现在可以构建我们的 crontab 文件。再加一点cmets(以#开头的部分,可以写成:

# 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
  0  15 *  *  4   [ $(date +\%d) -le 07 ] && command

上面的意思是,在任何一个星期四的第 15 个小时的第 0 分钟执行上面的命令。由于该命令包含第一周的测试,因此它只会在每月的第一个星期四运行。

【讨论】:

  • @DannyBelanger 我知道当您搜索答案但没有得到答案时会很沮丧。需要三天时间才能找到它更令人沮丧。我们都去过那里!另外,不理解以上内容并不代表愚蠢;这表明我给你的答案不清楚。我现在已经更新了答案,希望这更令人满意。
  • 感谢您的所有 cmets,我通过 Linux 开发人员通过其他方式找到了我正在寻找的答案。基本上,他说的是我必须每周四运行我的命令,在我的脚本中,我检查它是否是每个月的第一个星期四,如果是的话,运行我的命令。
  • @DannyBelanger 我很高兴听到您找到了适合您的解决方案。请注意,如果您想在星期三从命令行运行脚本,这可能会很烦人。有一个单独的脚本来执行此检查并调用原始脚本总是好的。
  • 相信我,如果我这样做,我不需要在星期三运行该脚本,我只需复制该脚本并删除检查。
【解决方案2】:

为什么不简单地使用:

# 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
  0  15  1-7  *  4   command

所以你告诉 cron 在第 4 天(星期四)的第一个 7 天的第 0 分钟、第 15 小时运行。它肯定只包括第一个星期四,因为在一个月的连续 7 天中肯定只有一个星期四,而连续 7 天不能是 2 个星期四。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2011-03-15
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    相关资源
    最近更新 更多