16

出于惊人的目的,我试图将作业安排为每 5 分钟运行一次的 2 分钟偏移量。那就是我想要一份工作在 1,6,11,16.. 运行,另一个在 2,7,12,17...

我找不到执行此操作的示例。所以我尝试了:

every 5.minutes, :at=> 1 do
 command "echo 'you can use raw cron sytax too'"
end 

这似乎可行,但所有 ':at' 示例看起来都在等待字符串格式的时间。以上是否有效,或者只是碰巧起作用,并且每个选项都不真正支持开始时间。

4

3 回答 3

19

听起来你在这两个工作之间有依赖关系,所以我认为有两种方法可以处理这个问题。如果您想在 1,6,11,16 等处运行,正如您的问题所建议的那样,那么只需使用原始 cron 语法:

every '0,5,10,15,20,25,30,35,40,45,50,55 * * * *' do
  command "echo 'you can use raw cron syntax one'"
end

every '1,6,11,16,21,26,31,36,41,46,51,56 * * * *' do
  command "echo 'you can use raw cron syntax two'"
end

但是一旦第一个工作完成后执行第二个工作可能会更好。这应该确保作业不会重叠,并且第二个仅在第一个完成后运行。

every 5.minutes do
  command "echo 'one' && echo 'two'"
end
于 2011-06-10T20:32:04.790 回答
11

every需要一个整数。

为了避免雷鸣般的羊群问题,你可以这样做。

every 5.minutes - 10.seconds do
  command "echo first task"
end

every 5.minutes + 10.seconds do
  command "echo second task"
end

您也可以随机化偏移量

def some_seconds
  (-10..10).to_a.sample.seconds
end

every 5.minutes + some_seconds do
  command "echo first task"
end

every 5.minutes + some_seconds do
  command "echo second task"
end

与其他答案一样,这不适用于相互依赖的任务。如果您的任务相互依赖,您应该使用rake它来为您处理它或在您的任务中手动运行下一个。

# shedule.rb
every 5.minutes do
  rake 'jobs:last_one'
end

# Rakefile.rb
namespace :jobs do
  task :first_one do
    sh 'first command'
  end

  task second_one: [:first_one] do
    sh 'second_command that_should_run_after_first_one'
  end

  task last_one: [:second_one] do
    sh 'last_command that_should_run_after_all_commands'
  end
end
于 2014-08-21T04:40:11.393 回答
2

是的,这应该是有效的。看看https://github.com/javan/whenever/blob/master/lib/whenever/cron.rb

查看 parse_time 方法。特别是这些行:

      when 1.hour...1.day
        hour_frequency = (@time / 60 / 60).round
        timing[0] = @at.is_a?(Time) ? @at.min : @at
        timing[1] = comma_separated_timing(hour_frequency, 23)
于 2013-10-04T21:24:59.260 回答