2011-06-10 4 views
13

엄청난 목적을 위해 나는 매 5 분마다 2 분 간격으로 작업을 예약하려고합니다. 그게 1 직업은 1,6,11,16 .. 2,7,12,17에 실행하는 다른 하나를 원한다. ...때마다 gem 및 오프셋 작업을 n 분 간격으로 시작하여 스케줄링

나는 이것을하는 예제를 찾을 수 없었다. 그래서 시도 :

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

이 작동하는 것 같다하지만 모든 '에서'예 모양이 문자열 형식으로 시간을 예상 할 수 있습니다. 위의 내용이 유효한지, 아니면 그냥 작동하고 있으며 모든 옵션이 실제로 시작 시간을 지원하지 않습니다.

답변

18

두 작업간에 종속성이있는 것 같아서 두 가지 방법으로 처리 할 수 ​​있다고 생각합니다. 당신은 1,6,11,16에서 실행 귀하의 질문에서 알 수 있듯이 등, 단순히 원시 크론 구문을 사용하려면 :

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

+0

@HeretoLearn은 pure ruby에서 이런 종류의 구문을 지원하지 않으므로 원시 crontab 구문을 사용해야합니다. 작업이 서로 종속되지 않으면 첫 번째 예제를 사용하여 작업을 실행하는 것이 좋습니다. –

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 시간을 사용하지만 1 시간 미만은 사용하지 않는다. – TomDavies

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 

오프셋 randomise 수 있습니다. 작업이 서로 의존하는 경우 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

+0

이것은 내가 생각한 것처럼 직관적으로 작동하지 않았습니다. '매 15 분 +2 분 do ' 이 내용은 다음과 같습니다. '17,34,51 * * *' 내가 무엇을 할 건지는 다음과 같습니다 : '2,17,32,47 * * * *' Rails 4.2.5에서 언제든지 사용 가능 0.9.4 – Shadoath

관련 문제