Ограничение экземпляров задачи rake

Есть ли способ ограничить количество экземпляров задачи rake?

У меня есть задача rake для чтения электронных писем, которая запускается каждые 5 минут как задание cron.

Иногда задачи rake выполняются более 5 минут, и до их завершения запускается другая задача rake.

Существуют хакерские обходные пути для проверки ps -Af внутри файла rake, но я ищу более чистый способ ограничить запуск нескольких экземпляров задач rake подобно тому, как это делает daemon gem.

Проверка электронной почты — это просто пример, у меня есть несколько таких рейк-задач, которые включают опрос нескольких серверов.


person Sid    schedule 21.07.2010    source источник
comment
Элегантный способ проверить, запущена ли та или иная задача rake, также будет приемлемым решением.   -  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

Все еще не могу найти супер элегантный способ, поэтому я прибегнул к сохранению уникального файла для каждой задачи rake.

Вот так сейчас выглядит задача rake -

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

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

person Community    schedule 22.07.2010
comment
Ваш подход хорош, хотя у вас есть состояние гонки между проверкой существования и выполнением «касания». Обойти это, выполнив вместо этого File.open(path, File::CREAT|File::EXCL) {}. Файл будет создан, если он еще не существовал, и в этом случае будет поднят EEXIST. Кроме того, вместо обратной галочки rm используйте: File.unlink(path), что будет намного эффективнее; и поместите отмену ссылки после «обеспечить» (begin; yield; обеспечить; File.unlink(path); end) - person Heath; 05.08.2010
comment
Благодарность! В моем случае задание cron запускается один раз в час, поэтому условия гонки маловероятны. Я обязательно включу замечательные предложения по использованию объекта File и добавлю контрольный случай. - person Sid; 21.08.2010