306 votes

Une tâche cron pour rails : meilleures pratiques ?

Quelle est la meilleure façon d’exécuter les tâches planifiées dans un environnement de Rails ? Script/runner ? Râteau ?

268voto

Jim Garvin Points 3318

J’ai utilisé le très populaire chaque fois que sur des projets qui s’appuient fortement sur les tâches planifiées, et c’est génial. Il vous donne une belle DSL pour définir vos tâches planifiées au lieu d’avoir à traiter avec le format de la crontab. Depuis le README :

Chaque fois qu’est un gem Ruby qui fournit une syntaxe claire pour l’écriture et le déploiement des tâches cron.

Exemple de fichier Lisezmoi :

114voto

tardate Points 6809

J’utilise l’approche de râteau (prises en charge par heroku)

Avec un fichier appelé lib/tasks/cron.rake...

Pour exécuter la ligne de commande, c’est juste « cron râteau ». Cette commande peut ensuite être mises sur le planificateur de tâche cron/système d’exploitation tel que désiré.

55voto

Ricardo Acras Points 11194

Récemment Railscasts.com déployé de très intéressants jette sur ce sujet. Ils couvrent de nombreux cas. Regarder les épisodes et de décider par vous-même.

22voto

Pankhuri Points 214

Dans notre projet, nous avons d'abord utilisé chaque fois que gem, mais face à certains problèmes.

Nous avons ensuite passé à RUFUS PLANIFICATEUR de gem, qui s'est avéré pour être très facile et fiable pour l'ordonnancement des tâches dans les Rails.

Nous les avons utilisés pour l'envoi hebdomadaire et journalière mails, et même pour l'exécution de certains périodiques râteau de tâches ou de toute méthode.

Le code utilisé dans le présent, c'est comme:

    require 'rufus-scheduler'

    scheduler = Rufus::Scheduler.new

    scheduler.in '10d' do
      # do something in 10 days
    end

    scheduler.at '2030/12/12 23:30:00' do
      # do something at a given point in time
    end

    scheduler.every '3h' do
      # do something every 3 hours
    end

    scheduler.cron '5 0 * * *' do
      # do something every day, five minutes after midnight
      # (see "man 5 crontab" in your terminal)
    end

Pour en savoir plus: https://github.com/jmettraux/rufus-scheduler

20voto

Freakent Points 726

En supposant que vos tâches de ne pas prendre trop de temps, il suffit de créer un nouveau contrôleur avec une action pour chaque tâche. Mettre en œuvre la logique de la tâche en tant que contrôleur de code, Puis mis en place une tâche cron au niveau de l'OS qui utilise wget pour appeler l'URL de ce contrôleur et l'action à intervalles appropriés. Les avantages de cette méthode sont vous:

  1. Avoir un accès complet à tous vos Rails objets comme un contrôleur de la normale.
  2. Pouvez développer et tester comme vous le faites des actions normales.
  3. Pouvez également appeler vos tâches ad hoc à partir d'une simple page web.
  4. Ne pas consommer plus de mémoire par des tirs supplémentaires ruby/rails de processus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X