2009-07-15 3 views
4

J'utilise delayed_job pour exécuter des travaux, avec de nouveaux travaux ajoutés chaque minute par un cronjob.Exécution d'un travail râteau

Actuellement, j'ai un problème où la tâche de travail rake: work, actuellement démarrée manuellement avec 'nohup rake jobs: work &', est exécutée au hasard.

Alors que Dieu semble être une solution pour certaines personnes, le surcroît de mémoire est plutôt ennuyeux et je préfère une solution plus simple qui peut être redémarrée par le script de déploiement (Capistrano). Y a-t-il un peu de magie bash/Ruby pour ce faire, ou suis-je destiné à exécuter un service de surveillance sur mon serveur avec des hacks horribles pour permettre au site non déployé que le site déploie de le redémarrer?

Répondre

0

Les documents delayed_job suggèrent que vous utilisiez un service de surveillance pour gérer le (s) travail (s) de travail râteau. J'utilise runit - fonctionne bien.

(Vous pouvez l'installer dans le mode où il ne remplace pas d'initialisation.)

Ajouté:

Re: redémarrage par Capistrano: oui, runit permet cela. Il suffit de faire un

kill sv delayed_job sudo

dans la recette Capistrano tuer le travailleur delayed_job. Runit le redémarrera alors avec votre base de code nouvellement déployée.

0

Pour moi le gem de démons n'était pas fiable avec delayed_job. Pourrait être un script mal écrit (utilisait celui sur collective delayed_job github page de collectiveidea), et pas la faute des démons, je ne suis pas vraiment sûr. Mais pour une raison quelconque, il recommencerait de manière incohérente lors des déploiements.

J'ai lu quelque part que c'était parce qu'il n'attendait pas que le processus se termine réellement, donc les fichiers pid seraient écrasés ou quelque chose comme ça. Mais je n'ai pas vraiment pris la peine d'enquêter. Je suis passé à la gemme de démons-spawn en utilisant these instructions et il semble être beaucoup plus fiable maintenant.

0

J'ai mis en petite tâche de râteau qui redémarre encore et encore la tâche de l'emploi:

desc "Start a delayed_job worker in a endless loop to prevent exits." 
task :jobs => :environment do 
    while true 
    begin 
     Delayed::Worker.new(:min_priority => ENV['MIN_PRIORITY'], 
          :max_priority => ENV['MAX_PRIORITY'], 
          :quiet => false).start 
    rescue Exception => e 
     puts "Exception occured (#{e})" 
    end 
    puts "Task jobs:work exited, clearing queue and restarting" 
    sleep 1 
    Delayed::Job.delete_all 
    end 
end 

Apparemment, cela n'a pas fonctionné. Donc, j'ai fini avec cette solution simple:

for ((;;)); do rake jobs:work --trace; done 
0

se débarrasser de l'emploi retardée et utiliser soit whenever ou resque

Questions connexes