2011-06-10 52 views
13

爲了令人驚訝的目的,我試圖安排一個2分鐘的偏移量,每5分鐘運行一次。這是我想要1個工作運行1,6,11,16 ..而另一個運行在2,7,12,17 ...每當寶石和安排一個工作每n分鐘開始在一個偏移量

我找不到一個例子來做到這一點。所以,我想:

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

這似乎是工作,但所有的「:在」實例看在期待一個字符串格式的時間。上述有效做法或剛剛發生的工作,每個選項都不能真正支持開始時間。

回答

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 
+0

感謝潘。是的,我看到了原始的cron語法支持,但是希望避免編寫整個字符串並隨時使用,以使我的工作變得輕鬆。也沒有對任務的依賴,並且有超過2個。我只是想錯開它們,以便它們不會每小時在同一時間運行。 – HeretoLearn 2011-06-13 13:45:02

+0

@Hereto學習每當在純ruby中不支持這種語法時,所以你必須使用原始的crontab語法。如果作業不相互依賴,那麼我會建議使用第一個示例運行它們。 – 2011-06-13 16:44:33

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) 
+0

此代碼顯示'at'選項僅用於1小時至1天,因此這不幸將不起作用。我查看了源代碼中的其他代碼,它出現間隔> 1小時使用,但在1小時內沒有。 – TomDavies 2015-10-21 13:49:18

6

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

與接受的答案相比,這看起來比解決問題更明智。 – Epigene 2014-10-13 10:58:50

+0

這並不像我所想象的那樣直觀。 '每15.分鐘+2分鐘做' 變成這樣: '17,34,51 * * * *' 我想要的是這樣的: '2,17,32,47 * * * *' 在Rails 4.2.5中工作,每當寶石0.9.4 – Shadoath 2016-03-24 17:36:36