出于惊人的目的,我正在尝试安排工作,每隔5分钟进行一次2分钟的偏移。那就是我想要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
这似乎有效,但所有':at'示例都期望以字符串格式表示时间。以上是有效的,或者只是恰好工作,并且每个选项都不支持起始时间。
答案 0 :(得分:18)
听起来你们两个工作之间存在依赖关系,所以我认为有两种方法可以解决这个问题。如果你想在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
答案 1 :(得分:8)
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
答案 2 :(得分: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)