我如何告诉 cron 每隔一天运行一个命令(奇数/偶数)

我如何告诉 cron 每隔一天运行一个命令(奇数/偶数)

当使用“月份”字段配置 cron 每隔一天运行一个命令时,如下所示:

1 22 */2 * * COMMAND

每当该月的某一天为奇数时它就会运行:1、3、5、7、9 等等。

如何将 cron 配置为在一个月中的几天(甚至像 2、6、8、10 等)运行(不按字面指定,这是有问题的,因为每个月都有不同的天数)?

答案1

您尝试的语法实际上是不明确的。根据每月有多少天,有些月份会在奇数天运行,有些月份会在偶数日运行。这是因为它的计算方式是将可能性的总数进行划分。您可以通过手动指定日期范围并使用奇数或偶数天来覆盖这种奇怪的行为。由于偶数日脚本永远不会在较长月份的第 31 天运行,因此使用 30 天作为偶数日的基础不会丢失任何内容,并且通过专门指定将其划分为就好像有 31 天一样,您可以强制奇数日天执行。

语法如下:

# Will only run on odd days:
0 0 1-31/2 * * command

# Will only run on even days:
0 0 2-30/2 * * command

您对月份天数不同的担忧在这里并不重要,因为没有哪个月份有比这更多的天数,并且对于可怜的二月,日期范围永远不会匹配最后一两天,但这不会造成任何伤害将其列出。

这种方法的唯一“陷阱”是,如果您处于奇数天周期,那么在 31 天的接下来的几个月中,您的命令也将在该月的第一天运行。同样,如果您强制执行偶数周期,则每个闰年都会在二月底产生一个为期三天的周期。你无法真正回避这样一个事实,即“每隔一天”的任何常规模式并不总是会出现在每个月的偶数或奇数天,并且以任何方式强迫你这样做,你要么会额外跑一次,要么会错过一次跑步天数不匹配的月份。

答案2

我认为一种可能性是使用一年中的某一天,如下所示:

# for odd days
test $(((`date +%j` % 2))) != 0 && command

# for even days
test $(((`date +%j` % 2))) == 0 && command

它针对 Unix 和 Linux 系统进行了测试。

答案3

让我们每天检查一下是否是“其他”:-)(bc需要程序)

0 0 * * * test $(echo `date +%s` / 86400 % 2 == 0 |bc) -eq 0 && command

(我不确定代码是否正确显示。该date +%s部分位于反撇号之间。)

答案4

就我个人而言,我避免使用该((jultest=$juledate/2))方法,因为它在处理大于 10 的数字时存在问题。

正如另一位用户所建议的 - bc 可以提供更强大的解决方案。

juldate=$(date +%j)
jultest=$(echo "obase=16;$juldate*2" | bc)
if [ $juldate -ne $jultest ]
then
  echo "This is an odd numbered week"
fi

相关内容