2010-01-17 4 views
16

Je suis en train d'écrire une application qui tire de nouvelles informations à partir de sources RSS et doit mettre à jour ces sources RSS dans une certaine fréquence. Actuellement, je ne tire que lorsque l'utilisateur demande un flux, mais je veux changer ce comportement en récupération automatique automatique. J'écrivais un shellscript qui interagissait avec la base de données et commençait périodiquement via cron - mais il y avait beaucoup de double effort alors je me demandais ce que serait le "Rails Way" ou "Ruby Way" pour le faire. J'utilise Ubuntu, Apache et Passenger. Pouvez-vous suggérer de meilleures méthodes qui sont peut-être même incluses dans l'application, afin que je puisse facilement déployer l'application sur une autre machine sans devoir me mêler à cron?Tâches récurrentes dans une application Ruby On Rails: Cron ou autre?

Répondre

19

Je suggère de faire quelque chose comme une tâche râteau et en utilisant le whenever gem pour générer votre travail cron pour exécuter la tâche rake.

Découvrez, http://railscasts.com/episodes/164-cron-in-ruby, pour plus d'informations sur la gemme whenver.

Le principal avantage du whenever gem est qu'il conserve les exigences de votre application (c'est-à-dire le travail cron s'exécutant toutes les x heures, dans l'application) dans votre application, augmentant ainsi la portabilité de votre application.

1

Il existe une variété de solutions. Pour la configuration la plus simple, vous pouvez utiliser script/runner dans votre crontab quelque chose comme ceci:

10 0 * * * /home/myuser/myproject/script/runner -e production ModelName.methodname 

MethodName doit être une méthode statique sur votre modèle. Vous devez référencer le projet par chemin d'accès complet, sinon il ne sera probablement pas trouvé dans l'environnement cron. Vérifiez votre page de manuel crontab pour plus d'informations sur la syntaxe de crontab si vous n'êtes pas familier. Ce qui précède, par exemple, exécute le script à la 10e minute de la 0e heure de chaque jour (à 12h10, en bref).

Si vous avez besoin d'une solution plus puissante, vous pouvez utiliser BackgroundRB. BackgroundRB exécute un démon et prend en charge les tâches planifiées et peut mettre des résultats dans une base de données. Ils ont même un protocole de communication simple pour permettre à vos processus web de demander qu'une tâche soit terminée, et ensuite avoir un moyen de récupérer le résultat. Cela vous permet de contrôler les tâches en arrière-plan directement à partir de l'interface Web, plutôt que d'utiliser un crontab qui "arrive".

Il y a un peu plus de configuration nécessaire pour que BackroundRB fonctionne, mais cela peut en valoir la peine si les tâches doivent être contrôlées.

6

Je recommande une combinaison des deux ci-dessus. Vous voulez une tâche rake, même si vous avez déjà créé une méthode directe. C'est parce que les tâches d'administration du serveur que vous voudriez exécuter dans cron, vous pourriez aussi vouloir exécuter à partir de la ligne de commande de temps en temps, et c'est ce que les tâches rake sont bonnes pour.

Chaque fois que le plugin sonne bien, je ne peux pas le garantir. Bien sûr, il est bon de savoir comment faire les choses à partir de zéro, puis utilisez des plugins pour vous faciliter la vie. Voici la façon de gratter.

Créer un nouveau fichier, lib/tasks/admin.rake

A l'intérieur, créer la tâche elle-même:

namespace :admin 
    desc "Updates all RSS feeds" 
    task :rss => :environment do 
    RssFeed.update_all 
    end 
end 

Cela suppose que vous avez une classe rssfeed, et la méthode update_all fait ce que vous attendez.Vous pouvez appeler cela de la ligne de commande:

rake admin:rss 

Et vous pouvez ajouter à cron (en appelant crontab -l que l'utilisateur Web) et en ajoutant cette ligne:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 
+1

Vous faites un bon point en sachant comment faire les choses manuellement. Le principal avantage de la gem quand même, comme je l'ai souligné ci-dessus, est non seulement la syntaxe d'écriture d'un nettoyeur de tâches cron, à cause de la DSL qu'il utilise, mais il vous permet de garder cette exigence métier (le travail cron), dans le contrôle de version avec votre application, ainsi quand vient le temps de passer à l'échelle, vous n'avez pas à aller chercher dans l'onglet cron, copier l'onglet cron, filtrer d'autres tâches cron sans rapport avec votre application, changer de chemin, Vous pouvez simplement générer les ajouts au crontab avec la gemme. – Travis

+0

Je suis totalement d'accord, et je vais certainement vérifier cette gemme pour moi-même! Vous avez raison, les crons * devraient * faire partie de l'application, être inclus dans le contrôle de version, etc. J'ai juste pensé que je contribuerais un peu à la fondation. –

1

Essayez d'utiliser whenever. Même si à la fin il va créer un cron, mais la définition de l'ordonnancement sera écrite dans votre application en utilisant Ruby DSL.

0

Pour les petites équipes et les projets personnels, chaque fois que c'est génial. Mais si votre entreprise a une équipe opérationnelle séparée de l'équipe de développement, ce n'est peut-être pas idéal. Lors de mon dernier travail, l'équipe des opérations devait pouvoir voir le cron que nous installions afin d'être sûr qu'il n'y aurait pas d'effets secondaires pour le système. Donc, une solution DSL ne fonctionnerait pas. Mais nous (les développeurs) voulions que les scripts cron soient contrôlés.

donc faire des compromis, nous avons vérifié les fichiers texte avec le Cron brut, semblable à ceci:

10 0 * * * cd /path/to/rails/app && rake RAILS_ENV=production admin:rss 

Et nous avons ajouté une étape au script Capistrano qui a installé que la crontab dans le cadre du déploiement.

+1

Lorsque vous tapez une fois dans votre application rails, elle sort les tâches cron. Ne pourriez-vous pas simplement afficher les tâches dans un fichier que l'équipe des opérations devrait examiner? – ericraio

0

Essayez la configuration webmin sur votre serveur. Si votre site hébergé le fournit. Allez à l'URL ci-dessous. Il est facile de configurer et d'utiliser Freiendly.

URL

est:

http://your_ip_address:10000/ 

Je l'ai utilisé cela dans beaucoup de mon application, il a travaillé pour moi de planifier des tâches cron.

Questions connexes