2011-06-10 9 views
13

चौंकाने वाले उद्देश्यों के लिए मैं नौकरियों को 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 

यह काम करने के लिए लगता है, लेकिन सब ': पर' उदाहरण देखने के लिए एक स्ट्रिंग प्रारूप में एक समय की उम्मीद कर सकते हैं। क्या उपर्युक्त काम करने के लिए वैध है या सिर्फ काम करने के लिए होता है और हर विकल्प वास्तव में प्रारंभिक समय का समर्थन नहीं करता है।

उत्तर

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

धन्यवाद पैन। हां, मैंने कच्चे क्रॉन सिंटैक्स समर्थन को देखा लेकिन पूरे स्ट्रिंग को लिखने से बचना और अपना काम आसान बनाने के लिए कभी भी उपयोग करना चाहता था। इसके अलावा कार्यों पर निर्भरता नहीं है और 2 से अधिक हैं। मैं बस उन्हें छेड़छाड़ करना चाहता हूं ताकि वे सभी हर घंटे एक ही समय में न चलें। – HeretoLearn

+0

@HeretoLearn जब भी शुद्ध रूबी में इस तरह के वाक्यविन्यास का समर्थन नहीं करता है, तो आपको कच्चे क्रोंटैब वाक्यविन्यास का उपयोग करना होगा। यदि नौकरियां एक दूसरे पर निर्भर नहीं हैं तो मैं उन्हें पहले उदाहरण का उपयोग करके चलाने की सलाह दूंगा। –

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

6

every एक पूर्णांक की अपेक्षा करता है।

झुंड की समस्या को रोकने से बचने के लिए, आप यह कर सकते हैं।

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

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

आप randomise कर सकते हैं भी

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

+0

यह मेरे लिए सहजता से काम नहीं करता जैसा मैंने माना था। 'हर 15.minutes + 2.minutes do'इसमें बदल गया: ' 17,34,51 * * * * ' जो मैं जा रहा था वह यह था: ' 2,17,32,47 * * * * ' जब भी मणि 0.9.4 के साथ रेल 4.2.5 में काम करना – Shadoath

संबंधित मुद्दे