Frage

Was ist der beste Weg, geplante Aufgaben in einer Rails-Umgebung laufen zu lassen? Skript / Läufer? Rake?

War es hilfreich?

Lösung

Ich bin mit dem Rake-Ansatz (wie unterstützt von Heroku )

Mit einer Datei namens lib / Aufgaben / cron.rake ..

task :cron => :environment do
  puts "Pulling new requests..."
  EdiListener.process_new_messages
  puts "done."
end

Um von der Befehlszeile ausführen, das ist nur „Rake cron“ ist. Dieser Befehl kann dann auf dem Betriebssystem cron / Task-Scheduler gesetzt werden, wie gewünscht.

Aktualisieren das ist ganz eine alte Frage und Antwort! Einige neue Informationen:

  • die Heroku Cron Service, den ich seit verwiesen wurde von Heroku Scheduler ersetzt
  • für häufige Aufgaben (insb. In dem Sie die Rails-Umgebung Start Kosten vermeiden wollen) meine bevorzugte Ansatz ist System cron zu verwenden, um ein Skript aufrufen, die entweder (a) eine sichere / private Webhook API stochern die erforderliche Aufgabe aufzurufen im Hintergrund oder (b) einreihen direkt eine Aufgabe auf der Warteschlange-System der Wahl

Andere Tipps

Ich habe das sehr beliebt Wann immer auf Projekte, die stark auf geplante Aufgaben verlassen, und es ist toll . Es gibt Ihnen einen schönen DSL geplante Aufgaben zu definieren, statt mit crontab Format beschäftigen. Aus der Readme:

  

Jedes Mal, wenn ein Ruby-Juwel, das eine bietet   klare Syntax zum Schreiben und Bereitstellen   Cron-Jobs.

Beispiel aus der Readme:

every 3.hours do
  runner "MyModel.some_process"       
  rake "my:rake:task"                 
  command "/usr/bin/my_great_command"
end

every 1.day, :at => '4:30 am' do 
  runner "MyModel.task_to_run_at_four_thirty_in_the_morning"
end

In unserem Projekt verwenden wir zuerst, wenn Juwel, aber konfrontierten einige Probleme.

Wir wechselten dann auf RUFUS SCHEDULER Edelstein, der nach außen gekehrt sehr einfach und zuverlässig für die Planung von Aufgaben in Rails sein.

Wir haben es verwendet für das Senden wöchentliche & täglich Mails und sogar für einige periodische Rake Aufgaben oder jede Methode ausgeführt wird.

Der Code in dieser verwendet wird, wie:

    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

Um mehr zu erfahren: https://github.com/jmettraux/rufus-scheduler

Angenommen, Ihre Aufgaben übernehmen Sie nicht zu lange zu vervollständigen, erstellen Sie einfach einen neuen Controller mit einer Aktion für jede Aufgabe. Implementieren Sie die Logik der Aufgabe als Controller-Code, dann einen Cronjob auf OS-Ebene nach oben, die wget verwendet die URL dieser Controller und die Aktion an den entsprechenden Zeitabständen aufzurufen. Die Vorteile dieser Methode sind Sie:

  1. haben vollen Zugriff auf alle Ihre Rails-Objekte wie in einem normalen Controller.
  2. Kann entwickeln und zu testen genauso wie normale Aktionen ausführen.
  3. Kann auch Ihre Aufgaben adhoc von einer einfachen Web-Seite aufrufen.
  4. Sie mehr Speicher nicht verbrauchen durch zusätzlichen Rubin Anheizen / Schienen-Prozesse.

Das Problem mit, wenn (und cron) ist, dass es die Schienen Umgebung lädt jedes Mal ausgeführt hat, das ist ein echtes Problem, wenn Sie Ihre Aufgaben häufig sind oder haben eine Menge Initialisierung zu tun. Ich habe Probleme in der Produktion hatte, weil dieser und muss Sie warnen.

Rufus Scheduler macht es für mich ( https://github.com/jmettraux/rufus-scheduler )

Wenn ich lange Arbeitsplätze zu laufen, ich benutze es mit delayed_job ( https://github.com/collectiveidea/delayed_job )

Ich hoffe, das hilft!

Ich bin ein großer Fan von resque / resque Scheduler . Sie können nicht nur cron-ähnlichen Aufgaben ausführen zu wiederholen, sondern auch Aufgaben zu bestimmten Zeiten. Der Nachteil ist, es erfordert einen Redis-Server.

Skript / Läufer und Rechen Aufgaben sind völlig in Ordnung, wie Cron-Jobs ausgeführt werden.

Hier ist eine sehr wichtige Sache, die Sie beachten müssen, wenn Cron-Jobs ausgeführt werden. Sie werden wahrscheinlich nicht aus dem Stammverzeichnis Ihrer Anwendung aufgerufen werden. Das bedeutet, alle Ihr erfordert für Dateien (im Gegensatz zu Bibliotheken im Gegensatz) sollte mit dem expliziten Pfad erfolgen: z File.dirname (__ FILE__) + "/ other_file". Dies bedeutet auch, Sie müssen wissen, wie sie explizit von einem anderen Verzeichnis nennen: -)

Überprüfen Sie, ob Ihr Code unterstützt mit

von einem anderen Verzeichnis ausgeführt werden
# from ~
/path/to/ruby /path/to/app/script/runner -e development "MyClass.class_method"
/path/to/ruby /path/to/rake -f /path/to/app/Rakefile rake:task RAILS_ENV=development

Auch Cron-Jobs laufen wahrscheinlich nicht, wie Sie, so hängen nicht von jeder Verknüpfung, die Sie in .bashrc setzen. Aber das ist nur eine Standard-cron Spitze; -)

Das ist interessant erwähnt niemand die Sidetiq . Es ist schön, zusätzlich, wenn Sie bereits mit Sidekiq.

  

Sidetiq bietet eine einfache API für die Definition wiederkehrende Arbeiter   Sidekiq.

Job wird wie folgt aussehen:

class MyWorker
  include Sidekiq::Worker
  include Sidetiq::Schedulable

  recurrence { hourly.minute_of_hour(15, 45) }

  def perform
    # do stuff ...
  end
end

Beide werden gut funktionieren. Ich benutze Skript / Läufer in der Regel.

Hier ist ein Beispiel:

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

Sie können auch einen reinen-Ruby-Skript schreiben, dies zu tun, wenn Sie die richtigen Konfigurationsdateien laden, um Ihre Datenbank zu verbinden.

Eine Sache im Auge zu behalten, wenn Speicher kostbar ist, dass Skript / Läufer (oder eine Rake Aufgabe, die auf ‚Umwelt‘ abhängt) wird die gesamte Rails-Umgebung laden. Wenn Sie nur einige Datensätze in die Datenbank eingefügt werden müssen, wird dieser Speicher verwenden Sie nicht wirklich müssen. Wenn Sie Ihr eigenes Skript schreiben, können Sie dies vermeiden. Ich habe nicht wirklich notwendig, um dies noch zu tun, aber ich bin am überlegen es.

Verwenden Sie Craken (rake centric Cronjobs)

Ich verwende BackgrounDRb.

http://backgroundrb.rubyforge.org/

Ich benutze es, geplante Aufgaben sowie Aufgaben auszuführen, die für die normale Client / Server-Beziehung zu lange dauern.

Hier ist, wie ich mein Setup cron Aufgaben. Ich habe eine täglichen Backups von SQL-Datenbank (unter Verwendung von Rake) und einer anderen auslaufen Cache einmal im Monat zu machen. Jede Ausgabe wird in einer Datei log / cron_log protokolliert. Meine crontab sieht wie folgt aus:

crontab -l # command to print all cron tasks
crontab -e # command to edit/add cron tasks

# Contents of crontab
0 1 * * * cd /home/lenart/izziv. whiskas.si/current; /bin/sh cron_tasks >> log/cron_log 2>&1
0 0 1 * * cd /home/lenart/izziv.whiskas.si/current; /usr/bin/env /usr/local/bin/ruby script/runner -e production lib/monthly_cron.rb >> log/cron_log 2>&1

Die erste Crontask macht täglich db-Backups. Der Inhalt cron_tasks sind die folgenden:

/usr/local/bin/rake db:backup RAILS_ENV=production; date; echo "END OF OUTPUT ----";

Die zweite Aufgabe war Setup später und verwendet Skript / Läufer Cache ablaufen einmal im Monat (lib / monthly_cron.rb):

#!/usr/local/bin/ruby
# Expire challenge cache
Challenge.force_expire_cache
puts "Expired cache for Challenges (Challenge.force_expire_cache) #{Time.now}"

Ich glaube, ich könnte eine andere Art und Weise Backup-Datenbank, aber bisher funktioniert es für mich:)

Pfade harken und Rubin auf verschiedenen Servern variieren kann. Sie können sehen, wo sie unter Verwendung sind:

whereis ruby # -> ruby: /usr/local/bin/ruby
whereis rake # -> rake: /usr/local/bin/rake

Mit etwas Sidekiq oder Resque ist eine viel robustere Lösung. Sie beide Unterstützung retrying Arbeitsplätze, Exklusivität mit einer REDIS Schloss, Überwachung und Planung.

Beachten Sie, dass Resque ist ein totes Projekt (nicht aktiv gepflegt), so Sidekiq eine Art und Weise bessere Alternative ist. Es ist auch mehr performant. Sidekiq mehr Arbeiter auf einem einzigen, Multi-Thread-Prozess läuft, während Resque jeden Arbeitnehmer in einem separaten Prozess ausgeführt

Ich habe erstellt vor kurzem einige cron-Jobs für die Projekte, die ich gearbeitet haben.

Ich fand, dass der Edelstein Uhrwerk sehr nützlich.

require 'clockwork'

module Clockwork
  every(10.seconds, 'frequent.job')
end

Sie können sogar Ihren Hintergrundjob mit diesem Juwel planen. Zur Dokumentation und weitere Hilfe finden Sie https://github.com/Rykian/clockwork

Wenn ich die gleiche Entscheidung zu treffen hatte und ich bin wirklich glücklich mit dieser Entscheidung heute. Verwenden Sie resque Scheduler , weil nicht nur ein eigener redis wird die Last von Ihren db nehmen, werden Sie auch Zugriff auf viele Plugins wie resque-web, die eine große Benutzeroberfläche zur Verfügung stellt. Als Ihr System entwickelt werden Sie mehr und mehr Aufgaben zu planen, so dass Sie in der Lage sein, sie von einem einzigen Ort zu steuern.

Sie resque und resque-shheduler Juwel für die Erstellung von crons verwenden können, ist dies sehr einfach zu tun.

https://github.com/resque/resque

https://github.com/resque/resque-scheduler

Wahrscheinlich der beste Weg, es wird mit Harke zu tun, um die Aufgaben schreiben Sie brauchen, und die es nur über die Befehlszeile ausgeführt werden.

Sie können ein sehr hilfreiches Video bei Railscasts

Werfen Sie auch einen Blick auf diesen anderen Ressourcen:

Ich habe Schnürchen Juwel und es funktioniert ziemlich gut für mich. Es gibt auch clockworkd Juwel, das ein Skript ermöglicht es als Daemon ausgeführt werden.

Ich bin nicht wirklich sicher, ich denke, es ist die Aufgabe abhängt: Wie oft zu laufen, wie viel komplizierter und wie viel die direkte Kommunikation mit dem Projektschiene benötigt wird, etc. Ich denke, wenn es nur war "One Bester Weg ", etwas zu tun, gäbe es nicht so viele verschiedene Möglichkeiten, es zu tun.

Bei meinem letzten Job in einem Rails-Projekt brauchten wir ein Batch-Einladung Mailer zu machen (Einladungen zu Umfragen, nicht Spamming), die die geplanten Mails senden soll, wenn der Server Zeit hat. Ich denke, wir Daemon Tools verwenden würden die Rake Aufgaben ausführen ich geschaffen hatte.

Leider hatte unser Unternehmen einige Geldprobleme und von dem Hauptkonkurrenten „gekauft“ wurde so das Projekt nie fertig gestellt wurde, damit ich weiß nicht, was wir haben schließlich verwendet würden.

Ich verwende Skript cron laufen, das ist der beste Weg, um einen cron zu laufen. Hier ist ein Beispiel für cron,

Öffnen CronTab -> sudo crontab-

Und Einfügen Bellow Zeilen:

00 00 * * * wget https: // ihr_host / some_API_end_point

Hier finden Sie einige cron-Format, wird Ihnen helfen,

::CRON FORMAT::

Examples Of crontab Entries
15 6 2 1 * /home/melissa/backup.sh
Run the shell script /home/melissa/backup.sh on January 2 at 6:15 A.M.

15 06 02 Jan * /home/melissa/backup.sh
Same as the above entry. Zeroes can be added at the beginning of a number for legibility, without changing their value.

0 9-18 * * * /home/carl/hourly-archive.sh
Run /home/carl/hourly-archive.sh every hour, on the hour, from 9 A.M. through 6 P.M., every day.

0 9,18 * * Mon /home/wendy/script.sh
Run /home/wendy/script.sh every Monday, at 9 A.M. and 6 P.M.

30 22 * * Mon,Tue,Wed,Thu,Fri /usr/local/bin/backup
Run /usr/local/bin/backup at 10:30 P.M., every weekday. 

Hope dies wird Ihnen helfen:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top