【问题标题】:How to create cron job that is executing every 3 months?如何创建每 3 个月执行一次的 cron 作业?
【发布时间】:2020-03-03 05:08:58
【问题描述】:

我在 ASP.NET Core 中为Cron (recurring) Jobs 使用Hangfire,我需要创建一个从给定开始日期开始每三个月运行一次的作业。

因此,如果开始日期是 2019 年 11 月 15 日,则应在 2019 年 11 月 15 日、2020 年 2 月 15 日、2020 年 5 月 15 日等等运行。

而且我需要它永远每 3 个月运行一次。

所以我为此尝试了以下 cron 表达式:“0 0 15 11/3 ?”或“0 0 15 11/3 *”

但在this translating site 测试后,它告诉我它将在以下日期运行:

2019-11-15
2020-11-15
2021-11-15
2022-11-15
2023-11-15

那么,如果这是真的,那么如何让它从如上所述的 2019 年 11 月 15 日开始每三个月运行一次并永远运行?

【问题讨论】:

  • 你应该试试 0 0 15 1/3 * 见crontab.guru/#0_0_15_1/3_*
  • @jbl 不过是在 1 月/4 月/7 月/10 月而不是 2 月/5 月/8 月/11 月运行。
  • @BenjaminW.yes,我没有注意到月份与问题相关

标签: cron hangfire


【解决方案1】:

cron 中的月份字段采用 1 到 12 之间的数字;根据使用的 cron 实现,您可以为月份字段使用显式列表:

0 0 15 2,5,8,11 *

或带步长的范围:

0 0 15 2-12/3 *

crontab.guru 似乎也支持带步长的单个值,但crontab man page 没有提及这种样式,因此它可能有效,也可能无效:

0 0 15 2/3 *

如果您希望能够在第一次运行前三个月以上进行设置,则必须手动检查日期;在 shell 中(使用 GNU date),你会做这样的事情:

0 0 15 2-12/3 * [ $(date +%%s) -gt $(date -d '2019-11-01' +%%s) ] && yourcommand

这会将当前日期与 2019 年 11 月 1 日进行比较;如果大于,则运行命令。

【讨论】:

  • 感谢您的回答,无论如何,我在 ASP.NET 中使用 Hangfire,而不是 Unix。但无论如何,您的回答“0 0 15 2-12/3 *”将在上述开始日期(2019 年 11 月 15 日)修复它,但不会像 2020 年 6 月 15 日这样的开始日期,如果我使用像“0 0 15 3-12/3 *”这样的 cron 表达式,然后它将从 2019-12-15、2019-3-15、2019-6-15 等开始......抱歉在我的问题中没有澄清,我不确定,但可能我应该以另一种方式处理这个问题(比如创建一个计划作业,该作业将在 2019 年 6 月 15 日插入一个带有“0 0 15 3-12/3 *”的 cron 作业。你怎么看?
  • @HusseinDahir 无论您正在运行什么,您都可以检查当前日期,并且只有在它超过您想要开始的日期时才继续。单独的 Cron 无法处理“从未来任意日期开始”。
【解决方案2】:

简单的解决方法是使用以下命令:

0 0 15 */3 *

这是非常直接的。这是来自 crontab.guru 网站的让您满意的输出 output of cron job

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2016-02-04
    • 1970-01-01
    • 2015-07-29
    • 2017-05-26
    • 2012-01-11
    • 2019-03-07
    相关资源
    最近更新 更多