每当宝石和每隔n分钟安排一个工作从偏移开始

Her*_*arn 16 ruby gem whenever

出于惊人的目的,我试图安排工作每2分钟一次,每5分钟一次.那就是我想要1个工作来运行1,6,11,16 ..而另一个工作要运行在2,7,12,17 ......

我找不到这样做的例子.所以我尝试过:

every 5.minutes, :at=> 1 do
 command "echo 'you can use raw cron sytax too'"
end 
Run Code Online (Sandbox Code Playgroud)

这似乎有效,但所有':at'示例看起来都期待一个字符串格式的时间.以上是有效的,或者只是恰好工作,并且每个选项都不支持起始时间.

Pan*_*kos 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
Run Code Online (Sandbox Code Playgroud)

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

every 5.minutes do
  command "echo 'one' && echo 'two'"
end
Run Code Online (Sandbox Code Playgroud)


Poo*_*avi 8

every 期望一个整数.

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

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

every 5.minutes + 10.seconds do
  command "echo second task"
end
Run Code Online (Sandbox Code Playgroud)

您也可以随机化偏移量

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
Run Code Online (Sandbox Code Playgroud)

像其他答案一样,这对于相互依赖的任务不起作用.如果您的任务相互依赖,您应该使用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
Run Code Online (Sandbox Code Playgroud)

  • 与接受的答案相比,这看起来是解决问题的更明智的方法. (2认同)