49 votes

La gemme "Whenever" exécutant des tâches cron sur Heroku

J'ai créé une application qui utilise la gemme whenever. La gemme crée des tâches cron. J'ai réussi à la faire fonctionner localement mais je n'arrive pas à la faire fonctionner sur heroku cedar. Quelle est la commande pour faire cela ?

en cours d'exécution :

heroku run whenever --update-crontab job1

ne fonctionne pas

79voto

Will Points 2056

Réponse courte : utilisez le module complémentaire de planification : http://addons.heroku.com/scheduler

Réponse longue : Lorsque vous exécutez heroku, nous

  1. faire tourner un banc d'essai
  2. mettez votre code dessus
  3. exécutez votre commande, attendez qu'elle se termine
  4. jeter le banc d'essai

Toutes les modifications que vous avez apportées à crontab seront immédiatement supprimées. Tout est éphémère, vous ne pouvez pas modifier les fichiers sur heroku, juste pousser du nouveau code.

0 votes

Que faire pour les tâches de longue haleine ? (il faut des heures pour les exécuter)

1 votes

C'est bien, vous aurez 24 heures pour le compléter

0 votes

@Will, mais l'application doit générer une sortie au moins une fois par heure, non ? ("Les connexions aux dynos ponctuels seront fermées après une heure d'inactivité (tant en entrée qu'en sortie).

13voto

Deepak Mahakale Points 13858

Vous devez ajouter Planificateur Heroku addon.

Vous pouvez l'ajouter directement depuis votre tableau de bord ou en utilisant les commandes suivantes :

  1. installer le add-on :

    heroku addons:create scheduler:standard
  2. Créer une tâche rake dans lib/tasks

    # lib/tasks/scheduler.rake
    task :send_reminders => :environment do
      User.send_reminders
    end
  3. Emploi du temps

    • Visitez Tableau de bord Heroku
    • Ouvrez votre application
    • Sélectionnez Planificateur de add-ons liste
    • Cliquez sur Ajouter un emploi saisissez une tâche et sélectionnez la fréquence.

      Par exemple, ajouter rake send_reminders , sélectionnez "Daily" y "00:00" pour envoyer des rappels tous les jours à minuit.

Heroku add cron task

2voto

whodini9 Points 1196

Si vous le voulez :

  • Utilice Heroku Scheduler
  • Exécuter les tâches toutes les minutes (et non 10 min)
  • Je me fiche des heures de vol sur le banc d'essai

C'était mon solution hack pour exécuter des tâches toutes les minutes - en supposant que la tâche se termine en moins de 60 secondes.

task start_my_service: :environment do
  1.upto(9) do |iteration|
    start_time = DateTime.now
    Services::MyService.call
    end_time = DateTime.now
    wait_time = 60 - ((end_time - start_time) * 24 * 60 * 60).to_i
    sleep wait_time if wait_time > 0
  end
end

2voto

SNeumann Points 1098

Les autres réponses précisent que vous devriez utiliser l'add-on Heroku Scheduler, et il est capable d'exécuter des tâches en arrière-plan en effet, mais il ne supporte pas la flexibilité de cron.

Il y a un autre add-on, appelé Cron To Go qui est capable d'exécuter vos travaux sur des dynos ponctuels avec la flexibilité de cron. Vous pouvez également spécifier un fuseau horaire pour votre travail et recevoir des notifications (email ou webhook) lorsque le travail échoue, réussit ou démarre.

(Divulgation complète - je travaille pour la société qui a créé et exploite Cron To Go)

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