我怎样才能告诉cron每隔一天(奇/偶)运行一条命令


45

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

1 22 */2 * * COMMAND

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

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

Answers:


60

您尝试的语法实际上是模棱两可的。根据一个月中有多少天,某些月份的运行时间可能是奇数天,偶数的几天。这是因为它的计算方式将可能性的总数除以了。您可以通过手动指定日期范围并使用奇数或偶数天来覆盖这种策略行为。由于偶数日脚本永远不会在较长月份的第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年将导致一个三天的周期和二月底。您无法真正避免这样一个事实,即“隔日”的任何常规模式并不总是会在每个月的偶数或奇数天下降,并且您以任何方式强迫这样做都会导致额外的运行或丢失两次运行之间的运行匹配天数不正确的月份。


1
谢谢,但是像2月这样的月份(您只有28天)会发生什么?实际上,这颗星星会照顾到它-但确实是模棱两可的。
弗雷迪(Freddie)

3
@freddie:请看我编辑过的答案……但这不是问题,因为超出范围的值将被忽略,在2月30日或2月31日不会发生任何事情。曾经 您可以使用类似的列表手动进行指定,0,2,4...,30,32,34这并不重要,超出范围的值永远不会匹配。
Caleb

1
谢谢!我了解,谢谢您提供的有用答案!
弗雷迪

3
在Ubuntu服务器8.04上,似乎使用月日零的语法无效(错误的月日)。但是,可以接受以下语法:0 0 2-30/2 * * command

1
Fedora和RHEL 5,6,7也不喜欢每月的0。正如user31053指出的: 0 0 2-30/2 * * command可以正常工作。
NoelProf 2014年

2

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

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

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

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


我更喜欢这个答案,因为它跳过了某些月份的奇数天的问题。无论如何,我建议用美元符号代替反引号:test $(($(date +%j) % 2)) == 0 && command
caligari 18'Apr

我已经查看了%j不是儒略日期,因此避免以新年test $(($(date +%s) / 86400 % 2)) == 0 && command
为准

感谢您的评论!我们的建议对我们很有帮助。我们使用该方案每天在不同的服务器节点上运行cron,它们都共享相同的crontab,但是脚本只允许在其中一个上运行脚本。但是,如果我们需要使其更加具体,我们将考虑您的建议。谢谢!!!
Jordi

1

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

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

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


这将每隔一天运行一次,但不会回答问题!根据月份的不同,它有时仍会在奇数天运行,有时甚至在偶数天运行。这与问题中的代码具有相同的结果,您只是通过在自纪元开始的几秒钟内进行自己的数学运算来得出结果。该时间间隔是从纪元开始的偶数天,而不是日历的偶数天。
Caleb 2014年

1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.