当我尝试为每月的 cronjob 设置时间时,我不得不使用“1.month”。
但这在今天为每个月创建了一个 cronjob,例如。
0 9 18 * * ..... 而不是
0 9 1 * * ..... 将在该月的第一天触发...
你在那里显示所有的 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
最有用的评论
如果你不想给出完整的日期,你可以尝试这样的事情:
每 1.month, :at => "本月早上 9 点开始"
这将产生预期的“0 9 1 * *”。 它也会让你的代码更简洁:)
希望有帮助。
-AP