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

fre*_*die 60 cron

将 cron 配置为每隔一天使用“Day of Month”字段运行命令时,如下所示:

1 22 */2 * * COMMAND
Run Code Online (Sandbox Code Playgroud)

每次当月的某一天是奇数时它都会运行:1、3、5、7、9 等等。

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

Cal*_*leb 83

您尝试的语法实际上是模棱两可的。根据一个月中有多少天,有些月份它会在奇数日运行,有些则在偶数日运行。这是因为它的计算方式采用了可能性的总数并将它们分开。您可以通过手动指定日期范围并使用奇数或偶数天来覆盖这种奇怪的行为。由于偶数日脚本永远不会在较长月份的第 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
Run Code Online (Sandbox Code Playgroud)

您对不具有相同天数的月份的担忧在这里并不重要,因为没有月份的天数比这多把它列出来。

这种方法的唯一“问题”是,如果您处于奇数日周期,那么接下来的 31 天您的命令也将在该月的第一天运行。同样,如果您强制执行偶数周期,则每个闰年将在 2 月底产生一个为期三天的周期。您无法真正绕过这样一个事实,即“每隔一天”的任何常规模式并不总是会在每个月的偶数或奇数天出现,并且以任何方式强制执行此操作,您要么多跑一次,要么错过一次运行天数不匹配的月份。

  • @freddie:请参阅我编辑过的答案……但这不是问题,因为超出范围的值将被忽略,2 月 30 日或 31 日不会发生任何事情。曾经。您可以手动指定一个列表,如“0,2,4...,30,32,34”,这没关系,超出范围的值永远不会匹配。 (3认同)
  • 在 Ubuntu 服务器 8.04 上,使用 day-of-month 零的语法似乎无效(bad day-of-month)。但是,接受以下语法:`0 0 2-30/2 * * command` (3认同)
  • 谢谢,但是像二月这样只有 28 天的月份会发生什么呢?明星实际上会照顾到这一点 - 但确实是模棱两可的。 (2认同)

Jor*_*rdi 6

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

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

# for even days
test $(((`date +%j` % 2))) == 0 && command
Run Code Online (Sandbox Code Playgroud)

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