是否有一个 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
但它们不是我想要的月份 运行,即,以五个月的固定间隔。
我找不到在启动月份的确切日期开始的方法。如果没问题,它是第一个(如下例),你可以使用这个:
“每 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
这需要一个由年份和月份指定的基准日期(baseyear
和 basemonth
,在 crontab 条目中作为参数与 2019
和 1
一起提供)加上一个以月为单位的间隔(interval
,示例中的值 5
)。
然后将当前年份和月份读入 year
和 month
,检查自基准日期以来已经过去了多少个月,并且该差异是否是 interval
的倍数(模除以间隔为 0),然后它运行您的脚本(在本例中只是一个 echo
命令)。
date
的格式字符串使用 %-m
来避免月份的零填充(得到 1
而不是 01
)。此功能可能不会出现在每个 date
中 – 我在这里使用 GNU date
。
我有一项日程安排工作,我想每五个月安排一次。假设我在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
但它们不是我想要的月份 运行,即,以五个月的固定间隔。
我找不到在启动月份的确切日期开始的方法。如果没问题,它是第一个(如下例),你可以使用这个:
“每 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
这需要一个由年份和月份指定的基准日期(baseyear
和 basemonth
,在 crontab 条目中作为参数与 2019
和 1
一起提供)加上一个以月为单位的间隔(interval
,示例中的值 5
)。
然后将当前年份和月份读入 year
和 month
,检查自基准日期以来已经过去了多少个月,并且该差异是否是 interval
的倍数(模除以间隔为 0),然后它运行您的脚本(在本例中只是一个 echo
命令)。
date
的格式字符串使用 %-m
来避免月份的零填充(得到 1
而不是 01
)。此功能可能不会出现在每个 date
中 – 我在这里使用 GNU date
。