Une tâche cron pour les rails: les meilleures pratiques?
Quelle est la meilleure façon d'exécuter les tâches planifiées dans un environnement Rails? Script/coureur? Râteau?
- quelle sera la fréquence de la tâche à exécuter?
- fréquemment! toutes les quelques minutes
- Pour ceux qui viennent ici de Google, de regarder au-delà de la accepté de répondre à de meilleures approches.
- Le chaque fois que la réponse semble plus raisonnable que l'on a accepté la réponse, qui est un vieux hack.
- Veuillez aussi méfiez-vous qu'au moins une réponse suppose que vous avez un certain gem installé.
- Un couple de (ce que j'ai trouvé pour être) bonnes pratiques sont résumées ici wisecashhq.com/blog/writing-reliable-cron-jobs
- Dans de nombreux cas, des tâches cron sont une mauvaise odeur. Mieux d'écrire un planificateur à travers sidekiq/resque (ou autre travailleur), ou écrire un démon (moins fonctionnel et contrôlables). Tâches Cron avoir au moins quelques mauvaises choses: 1) de verrouillage pour une instance est une douleur; 2) la surveillance ne peut être fait facilement; 3) la gestion des exceptions doit être écrit à nouveau manuellement; 4) pas facile de redémarrer; 5) toutes les questions ci-dessus sont facilement résoudre par le fond de travailleurs.
- Rake = Rubis faire. C'est comme outil extrêmement puissant. Je recommande le visionnement de Ryan Bates Railscast sur elle- railscasts.com/episodes/66-custom-rake-tasks
Vous devez vous connecter pour publier un commentaire.
Je suis en utilisant le râteau approche (appuyée par heroku)
Avec un fichier appelé lib/tasks/cron.râteau ..
À exécuter à partir de la ligne de commande, c'est juste "râteau " cron". Cette commande peut alors être mis sur le système d'exploitation cron/planificateur de tâches comme souhaité.
Mise à jour c'est tout à fait une vieille question et de la réponse! Quelques nouvelles infos:
load "#{Rails.root}/lib/tasks/cron.rake"
etrake cron
, mais j'ai reçu NameError: undefined variable locale ou de la méthode `cron' pour les principales:Objet:environment
de dépendance. Nous avons une très lourde application Rails qui prend du temps à démarrer, notre commission est appelée à chaque minute, et de consommer plus de ressources de départ du environnement Rails que l'exécution de la tâche. J'aimerais bien avoir déjà démarrage environnement Rails à être appelé par cron, ont quelque chose entre les controller approche et le râteau de l'environnement une.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 un bon DSL pour définir vos tâches planifiées au lieu d'avoir à traiter avec crontab format. À partir du README:
Exemple dans le README:
Dans notre projet, nous avons d'abord utilisé chaque fois que gem, mais face à certains problèmes.
Nous avons ensuite passé à RUFUS PLANIFICATEUR 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 & tous les jours de 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:
Pour en savoir plus: https://github.com/jmettraux/rufus-scheduler
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:
Le problème à chaque fois (et cron), c'est qu'il recharge les rails de l'environnement à chaque fois qu'il est exécuté, ce qui est un réel problème lorsque vos tâches sont fréquents ou beaucoup d'initialisation du travail à faire. J'ai eu des problèmes de production à cause de cela et doit vous en avertir.
Rufus planificateur de ne pour moi ( https://github.com/jmettraux/rufus-scheduler )
Quand j'ai longtemps des travaux à exécuter, je l'utilise avec delayed_job ( https://github.com/collectiveidea/delayed_job )
J'espère que cela aide!
Je suis un grand fan de resque/resque planificateur. Vous ne pouvez pas exécuter uniquement de répéter cron-comme des tâches mais aussi des tâches à des moments précis. L'inconvénient est qu'il nécessite un serveur Redis.
script/coureur et un râteau tâches sont parfaitement bien pour l'exécuter que des tâches cron.
Voici une chose très importante que vous devez retenir lors de l'exécution des tâches cron. Ils ne le feront probablement pas être appelée à partir de la racine du répertoire de votre application. Cela signifie que tous vos besoins pour les fichiers (par opposition à des bibliothèques) doit être fait avec le chemin d'accès explicite: par exemple, Fichier.dirname(__FILE__) + "/other_file". Cela signifie également que vous devez savoir comment appeler explicitement à partir d'un autre répertoire 🙂
Vérifier si votre code prend en charge en cours d'exécution à partir d'un autre répertoire avec
Aussi, des tâches cron probablement ne courent pas comme toi, donc ne dépend pas de n'importe quel raccourci que vous mettez dans .bashrc. Mais c'est juste une norme cron astuce 😉
Qui est intéressant, personne n'a mentionné le Sidetiq.
C'est sympa de plus, si vous utilisez déjà Sidekiq.
Travail ressemblera à ceci:
Les deux fonctionnent bien. J'ai l'habitude d'utiliser le script/runner.
Voici un exemple:
0 6 * * * cd /var/www/apps/your_app/current; ./script/runner --environment production 'EmailSubscription.send_email_subscriptions' >> /var/www/apps/your_app/shared/log/send_email_subscriptions.log 2>&1
Vous pouvez également écrire un pur-script Ruby pour ce faire, si vous chargez le droit des fichiers de configuration pour se connecter à votre base de données.
Une chose à garder à l'esprit si la mémoire est précieuse, c'est qu'script/coureur (ou une tâche Rake qui dépend de "l'environnement") se charge de l'ensemble de l'environnement Rails. Si vous avez seulement besoin d'insérer des enregistrements dans la base de données, ce sera l'utilisation de la mémoire, vous n'avez pas vraiment. Si vous écrivez votre propre script, vous pouvez éviter cela. Je n'ai pas réellement besoin de faire cela, mais j'envisage de me il.
Utilisation Craken (râteau centrée sur les tâches cron)
- Je utiliser backgroundrb.
http://backgroundrb.rubyforge.org/
Je l'utiliser pour exécuter des tâches planifiées ainsi que les tâches qui prennent trop de temps pour la normale client/serveur relation.
Voici comment j'ai configurer mon tâches cron. J'en ai un pour faire une sauvegarde quotidienne de la base de données SQL (à l'aide du râteau) et un autre à l'expiration du cache, une fois par mois. Toute sortie est enregistré dans un fichier de log/cron_log. Mon crontab ressemble à ceci:
La première tâche cron fait de l'db sauvegardes. Le contenu de cron_tasks sont les suivantes:
La deuxième tâche a été d'installation plus tard, et utilise un script/coureur à expiration cache une fois par mois (lib/monthly_cron.rb):
Je suppose que je pourrais sauvegarde de la base de données d'une autre façon, mais jusqu'à présent ça fonctionne pour moi 🙂
La chemins râteau et ruby peut varier sur différents serveurs. Vous pouvez voir où ils sont à l'aide de:
À l'aide de quelque chose de Sidekiq ou Resque est un beaucoup plus robuste solution. Ils ont à la fois le soutien de la nouvelle tentative d'emplois, d'exclusivité avec une REDIS verrouillage, de suivi et de planification.
Gardez à l'esprit que Resque est un projet mort (pas activement maintenu), de sorte Sidekiq est une façon meilleure alternative. Il est également plus performant: Sidekiq exécute plusieurs travailleurs sur une seule, multithread processus tandis que Resque s'exécute à chaque travailleur dans un processus séparé.
J'ai créé récemment des tâches cron pour les projets, j'ai travaillé sur.
J'ai trouvé que le gem sur des roulettes très utile.
Vous pouvez même planifier votre tâche en arrière-plan à l'aide de ce joyau.
Pour la documentation et aider davantage se référer https://github.com/Rykian/clockwork
Une fois que j'ai eu à prendre la même décision, et je suis vraiment heureux avec la décision d'aujourd'hui. Utilisation resque planificateur de parce que non seulement une salle de redis va prendre la charge de votre base de données, vous aurez également accès à de nombreux plugins comme resque-web qui fournit une interface utilisateur de qualité. En tant que votre système se développe, vous aurez de plus en plus de tâches de planification de sorte que vous serez en mesure de les contrôler à partir d'un seul endroit.
vous pouvez utiliser resque et resque-shheduler gem pour la création de crons, c'est très facile à faire.
https://github.com/resque/resque
https://github.com/resque/resque-scheduler
Probablement la meilleure façon de le faire est d'utiliser un balai pour écrire les tâches dont vous avez besoin et le juste de l'exécuter via la ligne de commande.
Vous pouvez voir un très utile vidéo à railscasts
Aussi jeter un oeil à ce que d'autres ressources:
J'ai utilisé sur des roulettes gem et il fonctionne assez bien pour moi. Il est également
clockworkd
gem qui permet l'exécution d'un script comme un démon.Je ne suis pas vraiment sûr, je suppose que cela dépend de la tâche: la fréquence d'exécution, combien compliqué et combien de communication directe avec les rails de projet est nécessaire etc. Je suppose que si il y avait juste "One Best Way" de faire quelque chose, il n'y aurait pas tant de façons différentes de le faire.
Lors de mon dernier emploi dans un des Rails de projet, nous avons besoin de faire un lot invitation mailer (invitations à des enquêtes, pas de "spamming"), qui doit envoyer le prévu mails à chaque fois que le serveur eu le temps. Je pense que nous allons les utiliser daemon tools pour exécuter les tâches rake que j'avais créé.
Malheureusement, notre société a eu quelques problèmes d'argent, et a été "acheté" par le principal rival de sorte que le projet n'a jamais été terminé, donc je ne sais pas ce que nous devrions éventuellement utilisé.
J'ai Utiliser le script à exécuter cron, c'est la meilleure façon d'exécuter une tâche.
Voici quelques exemple de cron,
Ouvrir CronTab —> sudo crontab -e
Et Collez Soufflet lignes:
00 00 * * * wget https://your_host/some_API_end_point
Voici quelques cron format, vous aidera à
Espérons que cela vous aidera 🙂