Ограничете случаите на рейк задача

Има ли начин да се ограничи броят на случаите на рейк задача?

Имам рейк задача за четене на имейли, която се изпълнява на всеки 5 минути като cron задача.

Понякога изпълнението на рейк задачите отнема повече от 5 минути и се стартира друга рейк задача, преди да приключи.

Има хакерски заобиколни решения за проверка на ps -Af вътре в рейк файла, но търся по-чист начин за ограничаване на стартирането на множество екземпляри на рейк задачите, подобно на това, което прави daemon gem.

Проверката на имейли е само пример, имам няколко такива рейк задачи, които включват анкетиране на множество сървъри.


person Sid    schedule 21.07.2010    source източник
comment
Елегантен начин да проверите дали дадена рейк задача се изпълнява или не също ще бъде приемливо решение.   -  person Sid    schedule 22.07.2010


Отговори (2)


Можете също така просто да използвате PidFile.

Първо инсталирайте скъпоценния камък „pidfile“. След това направете задачата си така:

task :my_task => :environment do |task|
    PidFile.new(:piddir => Rails.root.join('tmp', 'pids'), :pidfile => task.name)

    # do some stuff
end
person Aamer Abbas    schedule 07.11.2011

Все още не мога да намеря супер елегантен начин, затова прибягнах до запазване на уникален файл за всяка рейк задача.

Ето как изглежда рейк задачата сега -

run_unique_rake(__FILE__) do
     puts "\n is running\n"
     sleep(40)
end

тук е run_unique_rake

def self.run_unique_rake(file)    
    path = RAILS_ROOT + "/" + CONFIG['rake_log'] + "/" + File.basename(file)

     unless File.exists?(path)
        `touch #{path}`
         yield if block_given?
         `rm #{path}`
     end
end

Все още се надявам на елегантен начин в рамките на рейка да се ограничи до един екземпляр.

person Community    schedule 22.07.2010
comment
Вашият подход е добър, въпреки че имате състояние на надпревара между тестването на съществуването и извършването на „докосване“. Заобиколете това, като вместо това направите File.open(path, File::CREAT|File::EXCL) {}. Файлът ще бъде създаден, освен ако вече не е съществувал, в който случай ще бъде повдигнат EEXIST. Също така, вместо back-tick rm, използвайте: File.unlink(path), което ще бъде много по-ефективно; и поставете прекъсването на връзката след 'осигуряване' ( начало; добив; осигуряване; File.unlink(път); край) - person Heath; 05.08.2010
comment
Благодаря! В моя случай задачата cron се изпълнява веднъж на всеки час, така че условията на състезание са малко вероятни. Определено ще включа страхотните предложения за използване на обекта File и добавяне на защитен случай. - person Sid; 21.08.2010