0

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

Agenda 使用 cron 进行调度。

问题00 00 20 1,6,11 * 在于它永远不会在 4 月运行,它将
在 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

但它们不是我希望它运行的月份,即每隔五个月运行一次。

4

2 回答 2

0

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

0 0 20 * * monthcheck 2019 1 5

并且monthcheck是您路径中某处包含以下内容的脚本:

#!/usr/bin/env bash

baseyear=$1
basemonth=$2
interval=$3

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

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

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

然后它将当前年份和月份读入yearand month,检查自基础以来已经过去了多少个月,如果该差异是interval(模除以间隔为 0)的倍数,那么它运行您的脚本(只是一个echo命令在这个例子)。

date用于%-m避免月份零填充的格式化字符串(获取1而不是01)。这个特性可能并不存在于每个地方date——我在date这里使用的是 GNU。

于 2019-01-23T19:21:55.413 回答
0

我找不到在开始月份的确切日期开始的方法。如果可以,它是第一个(如下面的示例),您可以使用它:

联系大师

“每 5 个月的第 1 天的 00:00。”</p>

否则,请使用适合您需求的值。

于 2019-01-23T17:45:02.853 回答