在每月的特定日期运行 cronjob,但如果是周末则更早运行

在每月的特定日期运行 cronjob,但如果是周末则更早运行

我有一个 cronjob,它在每月 20 日早上 6 点运行一个脚本:

0 6 20 * * /opt/example.sh

这按预期工作,但我想对此进行调整,因此如果 20 日是星期六或星期日,则脚本会提前执行。例如:

该脚本计划于 2021 年 2 月 20 日运行,但这是星期六,因此它在 19 日星期五执行。同样,脚本计划在 2022 年 2 月 20 日运行,但这是星期日,因此它在 18 号星期五执行。

我无法找到任何选项或技巧来使用 cronjob 本身来完成此任务。我希望找到一些技巧来使用可用的替代单一值(即 crontab 中的星期日表示 SUN)。

我认为这需要在脚本本身中实现。

例如,我可以在 18 日运行它,并将脚本内的执行(睡眠)延迟到 20 日,除非周末到来。这对我来说似乎很容易出错。或者,我有一个想法,将执行安排在 18 日、19 日和 20 日,并检查脚本中的日期,是否符合我的意图。

有没有办法用 cron 本身来实现这个?

答案1

您可以在 上运行它18,19,20并检查当前日期,例如:

0 6 18,19,20 * * case $(LC_ALL=C date +\%a\%d) in (Sat*|Sun*);; (Fri18|Fri19|*20) /opt/example.sh; esac

只要不是周六或周日,就允许 20 号;只要是周五,就允许 18 号或 19 号。

答案2

我将创建一个runsometimes.sh包含以下内容的脚本:

#!/bin/bash
if [ $(date +%d) -eq 18 && $(date +%A) == "Friday" ] ; then/opt/example.sh ; exit ; fi
if [ $(date +%d) -eq 19 && $(date +%A) == "Friday" ] ; then /opt/example.sh ; exit; fi
if [ $(date +%d) -eq 20 ] ; then /opt/example.sh ; fi

并确保 cron 每天测试它:0 6 * * * runsometimes.sh

一些注意事项:

  • 我写的脚本比应有的长,你可以通过组合条件将其缩小为 1 个“if-then-fi”。我只是这样写,因为这样更容易阅读
  • “良好的风格”规定我应该使用else而不是exit,但再说一遍:我认为这更容易阅读
  • 我很快就写了答案,没有测试,请先测试再使用!
  • 我假设您的系统使用英语语言环境(再次使其更易于阅读)。如果你想“正确”地做到这一点,请使用$(date +%u) -eq 5而不是$(date +%A) == Friday

编辑:我没有阅读整个问题,并且错过了您想单独使用 cron 来完成的事情。我担心这是不可能的......

相关内容