2010-07-21 9 views
0

Existe-t-il un moyen de limiter le nombre d'instances d'une tâche rake?Limite des instances de la tâche rake

J'ai une tâche de rake pour lire les courriels qui s'exécute toutes les 5 minutes comme un travail cron.

Parfois, les tâches de rake prennent plus de 5 minutes et une autre tâche rake est lancée avant la fin.

Il y a des solutions de contournement aki pour vérifier ps -Af dans le fichier de coupe, mais je suis à la recherche propre moyen de limiter le lancement de plusieurs instances des tâches de râteau similaires à la façon dont le joyau du démon fait.

Vérification des courriels est juste un exemple, j'ai plusieurs tâches râteau qui impliquent interroger plusieurs serveurs.

+0

Une manière élégante de vérifier si une tâche de rake particulière est exécutée ou non sera également une solution acceptable. – Sid

Répondre

1

Vous pouvez également utiliser un fichier PidFile.

D'abord, installez la gemme 'pidfile'. Ensuite, faites votre tâche comme ceci:

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

    # do some stuff 
end 
0

Je n'arrive toujours pas à trouver un moyen super élégant, j'ai donc décidé d'enregistrer un fichier unique pour chaque tâche de rake.

Voici comment la tâche de coupe ressemble maintenant -

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

ici est 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 

espérant toujours une façon élégante à l'intérieur de râteau pour limiter à une seule instance.

+2

Votre approche est bonne, même si vous avez une condition de concurrence entre tester l'existence et faire le «toucher». Contournez cela en faisant File.open (chemin, File :: CREAT | File :: EXCL) {} à la place. Le fichier sera créé, sauf s'il existait déjà, auquel cas EEXIST sera généré. Aussi, au lieu de back-tick rm, utilisez: File.unlink (chemin) qui sera beaucoup plus efficace; et mettre le unlink après un 'assurer' (commencer; rendement; assurer; File.unlink (chemin); fin) – Heath

+0

merci! Dans mon cas, le travail cron s'exécute une fois par heure, donc les conditions de course sont improbables. Je vais certainement incorporer les bonnes suggestions sur l'utilisation de l'objet File et l'ajout d'un cas d'assurance. – Sid

Questions connexes