2010-01-17 10 views
16

Actualmente estoy escribiendo una aplicación que extrae nueva información de las fuentes RSS y tiene que actualizar esas fuentes RSS en cierta frecuencia. Actualmente estoy tirando solo cuando el usuario solicita un feed, pero quiero cambiar ese comportamiento a la búsqueda periódica automática.Tareas recurrentes en una aplicación Ruby On Rails: ¿Cron u otra?

Estaba escribiendo un shellscript que interactuaría con la base de datos y se inicia periódicamente a través de cron, pero esto supone un gran esfuerzo, así que me preguntaba cuál sería el "modo Rails" o "Ruby Way" para hacerlo. Estoy usando Ubuntu, Apache y Passenger. ¿Puede sugerir mejores métodos que quizás estén incluidos en la aplicación, así que puedo implementar fácilmente la aplicación en otra máquina sin tener que mezclarme con cron?

Respuesta

19

Sugeriría hacer algo así como una tarea de rake y usar el whenever gem para generar su trabajo cron para ejecutar la tarea de rake.

Consulte, http://railscasts.com/episodes/164-cron-in-ruby, para obtener más información sobre la gema del momento.

El beneficio principal de whenever gem es que mantiene los requisitos de su aplicación (es decir, el trabajo cron ejecutándose cada x horas, en la aplicación) dentro de su aplicación, lo que aumenta la portabilidad de su aplicación.

1

Hay una variedad de soluciones. Para la configuración más simple, puede utilizar script/runner en su crontab algo así:

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

MethodName debe ser un método estático en su modelo. Debe hacer referencia al proyecto por ruta completa; de lo contrario, no se encontrará lo más probable en el entorno cron. Consulte su página de manual de crontab para obtener información sobre la sintaxis de crontab si no está familiarizado. Lo anterior, por ejemplo, ejecuta el script en el minuto 10 de la hora 0 de cada día (a las 12:10 a.m., en resumen).

Si necesita una solución más potente, puede usar BackgroundRB. BackgroundRB ejecuta un daemon y admite tareas que se programan, y puede poner resultados en una base de datos. Incluso tienen un protocolo de comunicación simple para permitir que sus procesos web soliciten que se complete una tarea, y luego tienen una manera de recuperar el resultado. Esto le permite controlar trabajos en segundo plano directamente desde la interfaz web, en lugar de un crontab que simplemente "sucede".

Hay una buena cantidad de configuración necesaria para que BackroundRB funcione, pero puede valer la pena si se deben controlar los trabajos.

6

Recomiendo una combinación de los dos anteriores. Desea una tarea de rake, incluso si ya tiene un método directo creado. Esto se debe a que el administrador del servidor debe ejecutar cron, también es posible que desee ejecutarlo desde la línea de comando ocasionalmente, y esto es para lo que las tareas de rake son buenas.

El plugin siempre que suene genial, aunque no puedo responderlo. Por supuesto, es bueno saber cómo hacer las cosas desde cero, y luego usar complementos para hacerte la vida más fácil. Aquí está el camino desde cero.

Crear un nuevo archivo, lib/tasks/admin.rake

el interior, crear la propia tarea:

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

Esto supone que tiene una clase RssFeed, y el método update_all hace lo que se espera.Usted puede llamar a esto desde la línea de comandos:

rake admin:rss 

Y se puede añadir esto a cron (llamando crontab -l como el usuario de la web) y la adición de esta línea:

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

Usted hace un buen punto al saber cómo hacer cosas manualmente. Sin embargo, el beneficio principal de la gema siempre, como señalé anteriormente, no es solo la sintaxis de escribir un trabajo cron más limpio, debido a la dsl que usa, sino que le permite cumplir con ese requisito comercial (el trabajo cron), en el control de versiones con su aplicación, de esa manera cuando llegue el momento de ampliar, no tiene que ir a buscar en la pestaña cron, copiar la pestaña cron, filtrar otras tareas cron no relacionadas con su aplicación, cambiar rutas, etc. Puede generar las adiciones al crontab con la gema. – Travis

+0

Estoy totalmente de acuerdo, ¡y definitivamente voy a pagar esa joya por mí mismo! Tienes razón, los crones esperados * deberían * ser parte de la aplicación, incluidos en el control de versiones, etc. Simplemente pensé que contribuiría con algo de fundamento. –

1

Trate de usar whenever. Aunque al final creará un cron, pero la definición de programación se escribirá dentro de su aplicación usando Ruby DSL.

0

Para equipos pequeños y proyectos personales, la joya siempre que sea genial. Pero si su empresa tiene un equipo de operaciones separado del equipo de desarrollo, puede que no sea lo ideal.

En mi último trabajo, el equipo de operaciones necesitaba poder ver el cron que estábamos instalando para que pudieran estar seguros de que no tendría ningún efecto secundario para el sistema. Entonces una solución DSL no iba a funcionar. Pero nosotros (los desarrolladores) queríamos los scripts cron en el control de versiones.

lo tanto a un compromiso, nos registramos archivos de texto con el cron crudo, similar a esto:

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

y añadimos un paso a la secuencia de comandos que instala Capistrano que al crontab como parte del despliegue.

+1

Cuando escriba siempre en su aplicación de rieles, emite los trabajos cron. ¿No podrías simplemente enviar los trabajos a un archivo para que el equipo de operaciones los observe? – ericraio

0

Pruebe la configuración webmin en su servidor. Si su sitio alojado lo proporciona. Ir a la URL mencionada a continuación. Es fácil de configurar y el usuario freiendly.

URL es:

http://your_ip_address:10000/ 

he utilizado esto en muchos de mi solicitud ha funcionado para mí para programar tareas cron.