Whenever: 指定月度作业的日期

创建于 2009-06-18  ·  13评论  ·  资料来源: javan/whenever

当我尝试为每月的 cronjob 设置时间时,我不得不使用“1.month”。
但这在今天为每个月创建了一个 cronjob,例如。

0 9 18 * * ..... 而不是
0 9 1 * * ..... 将在该月的第一天触发...

最有用的评论

如果你不想给出完整的日期,你可以尝试这样的事情:

每 1.month, :at => "本月早上 9 点开始"
这将产生预期的“0 9 1 * *”。 它也会让你的代码更简洁:)

希望有帮助。

-AP

所有13条评论

你在那里显示所有的 cron 输出吗? 您的第一个示例在小时位置为 9,在一天中为 18。

 # .---------------- 分钟 (0 - 59) 
 # | .------------- 小时 (0 - 23)
 # | | .--------- 月份中的第几天 (1 - 31)
 # | | | .------- 月 (1 - 12) 或 jan,feb,mar,apr ... 
 # | | | | .---- 星期几 (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 
 # | | | | |
 # * * * * * 要执行的命令

不,完整的输出是:

0 9 18 * * command

你能粘贴你的 schedule.rb 文件吗? 似乎有些不对劲。

every 1.month, :at => "9 AM" do
  command "..."
end

啊,我看到了问题(除了我在这方面没有好的文档)。 当您将 :at 与 1.month 一起使用时,从时间开始解析天、小时和分钟。 因此,当您只使用上午 9 点这样的时间时,它会假设您所指的日期是今天。

纠正这个问题的一种方法是给它一个完整的日期。 我承认这看起来很难看,但它应该可以工作:每 1.month,:at =>“1 月 1 日上午 9 点”

它将忽略“一月”,但它是成功解析所必需的(每当使用 Chronic gem 解析日期和时间时)。

希望有帮助。

如果你不想给出完整的日期,你可以尝试这样的事情:

每 1.month, :at => "本月早上 9 点开始"
这将产生预期的“0 9 1 * *”。 它也会让你的代码更简洁:)

希望有帮助。

-AP

谢谢爪哇。

正如你所说,那不好看,但它有效!

tsommer ...我发布的上述解决方案应该有效。 我不确定你是否看过。

“本月早上 9 点开始”——这是规则! 谢谢。

我需要表达这个 cron 作业“0 0 27-31 * *”。 当前的语法是否可行?

也许在 DSL 中提供另一种方法来以正常的 cron 语法传递 cron 作业会更好,例如:

 cron "0 0 27-31 * *" 做
 # ...
结尾

我同意原始语法选项会很好(欢迎补丁!)。 与此同时,你可以用一点 Ruby 来做到这一点。

every 1.month, :at => (27..31).to_a.map { |d| "12am January #{d}" } do
  command "..."
end

Javan 感谢您的快速响应。
目前我正在使用以下补丁。 也许正则表达式可能需要一些改进,但它现在对我有用。

类每当::输出:: Cron
 CRON_EXP = /[^\s]+\s[^\s+]\s[^\s]+\s[^\s]+\s[^\s]+/

 def time_in_cron_syntax
 案例@time
 当 CRON_EXP 然后@time
 当符号然后 parse_symbol
 当 String 然后 parse_as_string
 否则解析时间
 结尾
 结尾
结尾

然后我可以这样做:

每 '0 0 27-31 * *' 做
 ...
结尾

我如何创建每 2 个月,一天结束(31 日),晚上 11 点 59 分做 cron?
每 2.month,在 59 11 L * 0

此页面是否有帮助?
0 / 5 - 0 等级