crontab 仅排除特定日期

crontab 仅排除特定日期

我怎样才能编写一个排除特定日期的 cron?

假设:我需要在周末每 30 分钟运行一次 crontab,从下午 6 点到晚上 9 点,并且只想排除 2014 年 5 月 10 日。

是否可以?我该怎么写这个?或者有什么替代方案吗?请建议。

答案1

标准 cron 语法非常简单,它不支持排除。在某些情况下,可以创建几个/多个 cron 条目的列表来实现此类逻辑,但这往往很乏味且难以理解或维护;但这种方法不适用于您的情况(尤其是因为标准 cron 没有日历年的概念)。

让 cron 命令变得复杂并不是一个好计划,但是您可以使用相对简单的方法来做到这一点,例如:

0,30 18-20 * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand
0    21    * * sat,sun [ "$(date +\%Y\%m\%d)" = "20140510" ] || mycommand

(使用“ 0,30 18-21”,任务也会在 21:30 运行;如果您希望也在 21:00 运行,则需要第二行,如果不是,则忽略它)

注意:在一些crontab你必须转义百分号(它们用于在将内联数据填充到命令的标准输入中时指示换行符),尽管不在 Dillon 的 cron 中。

cron 命令实际上是一个 shell命令列表||控制算子提供短路评估命令。列表中的命令从左到右一次尝试一个,但当第一个命令返回 true 时停止执行。如果日期字符串比较返回 true(仅一天为 true)mycommand则不运行,当日期比较返回 false 时mycommand运行。

但请注意,cron 启动程序的方式有很多不同。最可靠的方法是使用包装脚本来实现条件逻辑。

答案2

您可以用于X-Y时间间隔和*/Z频率。在哪里:

  • X是间隔的开始。
  • Y是间隔的结束。
  • Z只是一个除数(即:每个Z)。

为了排除某个日期,我只需创建自己的脚本。在此脚本中,检查日期,然后决定是否要执行以下指令。

相关内容