是否有一个 Cron 表达式来跨年度每 5 个月安排一次任务?

Is there a Cron expression to schedule task after every 5 months across year boundaries?

我有一项日程安排工作,我想每五个月安排一次。假设我在1月20日开始那份工作,那么现在的时间表应该是2019年1月20日、2019年6月20日、2019年11月20日、2020年4月20日等等。

Agenda 使用 cron 进行调度。

00 00 20 1,6,11 * 的问题是它永远不会 运行 四月,这 运行
在 2019-06-01 00:00:00
然后在 2019-11-01 00:00:00
然后在 2020-01-01 00:00:00
然后在 2020-06-01 00:00:00
然后在 2020-11-01 00:00:00.

我使用的另一个表达式是00 00 20 */5 *。接下来的 运行 次是
在 2019-06-20 00:00:00
然后在 2019-11-20 00:00:00
然后在 2020-01-20 00:00:00
然后在 2020-06-20 00:00:00
然后在 2020-11-20 00:00:00

但它们不是我想要的月份 运行,即,以五个月的固定间隔。

我找不到在启动月份的确切日期开始的方法。如果没问题,它是第一个(如下例),你可以使用这个:

Contab guru

“每 5 个月的第 1 天 00:00。”

否则使用适合您需要的值。

Cron 无法直接执行此操作,但您可以将该逻辑移动到您每月调用的脚本中。您的 cron 作业可能看起来像

0 0 20 * * monthcheck 2019 1 5

monthcheck 是您路径中某处的脚本,内容如下:

#!/usr/bin/env bash

baseyear=
basemonth=
interval=

read -r year month <<< "$(date '+%Y %-m')"

if (( (12*(year-baseyear) + (month-basemonth)) % interval == 0 )); then
    echo "Run the script"
fi

这需要一个由年份和月份指定的基准日期(baseyearbasemonth,在 crontab 条目中作为参数与 20191 一起提供)加上一个以月为单位的间隔(interval,示例中的值 5)。

然后将当前年份和月份读入 yearmonth,检查自基准日期以来已经过去了多少个月,并且该差异是否是 interval 的倍数(模除以间隔为 0),然后它运行您的脚本(在本例中只是一个 echo 命令)。

date 的格式字符串使用 %-m 来避免月份的零填充(得到 1 而不是 01)。此功能可能不会出现在每个 date 中 – 我在这里使用 GNU date