it-swarm.cn

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

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

1 22 */2 * * COMMAND

它在每个月中的某天都是奇数时运行:1、3、5、7、9,依此类推。

我如何配置cron在每月的几天中运行,例如2、6、8、10,依此类推(不按字面值指定,这是有问题的,因为每个月的月份天数不同)?

46
freddie

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

您担心的是几个月的天数并不重要,因为没有几个月的天数超过此天,对于2月的情况不佳,日期范围永远不会匹配最后一两天,但这不会造成任何损害列出来。

这种方法的唯一“陷阱”是,如果您处于奇数日周期,则在31天的几个月之后,您的命令也会在该月的第一天运行。同样,如果您要强迫一个偶数周期,则每个leap年将在2月底导致一个三天的周期。您无法真正避免这样一个事实,即“隔日”的任何常规模式并不总是会在每个月的偶数或奇数天下降,并且您以任何方式强迫这样做都会导致额外的运行或丢失两次运行之间的运行天计数不匹配的月份。

64
Caleb

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

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

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

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

2
Jordi

通常,我每天都会运行它,并让脚本使用逻辑来确定它是否应该在今天运行。

制作一个简单的状态文件来告诉上次运行时间,然后进行配对将非常容易。

如果需要通过不同的源运行它,则使其依赖于参数。

1
Klas Mattsson

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

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

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

1
user37264