Tareas periodicas

Hola lista,

Quiero incluir en mi aplicacion la capacidad de crear alertas, para
que envíe automáticamente emails a la cuenta asociada al usuario que
crea la alerta. Es decir, creo una alerta hoy jueves, con periodicidad
semanal, y con un texto. Es por ello que todos los jueves me tiene que
enviar la aplicacion un email.
Para ello he estado mirando varios plugins, entre los que está
BackgrounDrb y RailsCron. Por lo que he leido BackgrounDrb es mucho más
completo que el otro, pero no se si con RailsCron me basta para lo que
quiero.
¿Me podeis echar una manita? ¡Muchas gracias!

2008/10/9 Jose Antonio P. [email protected]

quiero.
¿Me podeis echar una manita? ¡Muchas gracias!

Si quieres algo rápido, te basta con que te montes una tarea rake que
cuando
la invoques haga lo que necesitas: buscar alertas pendientes, enviarlas,
marcarlas como enviadas, etc. Esta tarea después la puedes programar
directamente desde el cron del servidor, para que se lance cada x
minutos, y
listo…

Eso sí, esto supone que cada x minutos se va a levantar un nuevo proceso
que
cargue la aplicación, ejecute el rake, y se cierre. Si lo tienes que
lanzar
muchas veces, que prácticamente esté de contínuo currando, mejor
entonces
con algún plugin que se quede como demonio; pero en principio te valdrá
perfectamente con una tarea rake y cron a pelo.

¿Y cómo veis la combinación starling + workling ?

Saludos

Francesc E. escribió:

2008/10/9 Jaime I. [email protected]:

Si quieres algo rápido, te basta con que te montes una tarea rake que cuando
la invoques haga lo que necesitas: buscar alertas pendientes, enviarlas,
marcarlas como enviadas, etc. Esta tarea después la puedes programar
directamente desde el cron del servidor, para que se lance cada x minutos, y
listo…

La opción de la tarea rake es interesante siempre que el código sea
dry. Si tenemos Alerta.enviar_pendientes desde la tarea rake
simplemente deberiamos hacer un …

task :enviar_pendientes => :environment do
  Alerta.enviar_pendientes
end

Tambien los podriamos hacer con script/runner …

script/runner -e production "Alerta.enviar_pendientes"

Las dos opciones las puedes invocar desde el cron. Como dice Jaime, te
puede interesar tenerlo como demonio funcionando todo el dia, para
ello puedes utilizar la gema daemons.

Otra opción es que no cargues todo el framework para realizar los
envios de las alertas, de manera que el proceso serà bastante más
liviano. Puedes crearte un “ruby script” para hacer esto.

require 'rubygems'
require 'activerecord'
require 'app/models/alerta'

# connect to the database (sqlite in this case)
ActiveRecord::Base.establish_connection({
  :adapter => "sqlite3",
  :dbfile => "db/development.sqlite3"})

Alerta.enviar_pendientes

Puedes usar algún script del tipo

def procesa_cada_x_seg(seg)
fork do
loop do
before = Time.now
yield
interval = seg - (Time.now - before)
sleep(interval) if interval > 0
end
end
end

procesa_cada_x_seg(300) { puts ‘Lo que sea’ }

El bloque se ejecuta en el yield. Yo lo tengo en un proyecto para hacer
una
tarea diaria de Mashup de una web y hasta ahora me va bien. Lo tengo
metido
en el arranque de la máquina como un demonio más.

Es es mas para “long running tasks”. Vas metiendo los trabajos en cola
i los procesas cuando quieres un tras otro.

En tu caso has de poder elegir la alerta a enviar en una hora
determinada. Yo tiraría de script runner.

Echando un vistazo a todo lo que me habeis comentado y buscando por la
red, he encontrado esto referente a rake y cronjob.

http://www.rodolinux.com.ar/node/60

PicOlio

El tutorial del primer enlace está bastante curioso y lo explica muy
bien.
El otro enlace es referente a cronjob. ¿Lo habeis probado?

Por cierto, decir que trabajo en windows. Lo digo por el tema de
ciertas incompatibilidades con algunos plugin.

Francesc E. wrote:

Es es mas para “long running tasks”. Vas metiendo los trabajos en cola
i los procesas cuando quieres un tras otro.

En tu caso has de poder elegir la alerta a enviar en una hora
determinada. Yo tiraría de script runner.

El 9 de octubre de 2008 2:52, Jose Antonio P. <
[email protected]> escribió:

Hola lista,

Quiero incluir en mi aplicacion la capacidad de crear alertas, para
que envíe automáticamente emails a la cuenta asociada al usuario que
crea la alerta. Es decir, creo una alerta hoy jueves, con periodicidad
semanal, y con un texto. Es por ello que todos los jueves me tiene que
enviar la aplicacion un email.

Además de las buenas recomendaciones que has recibido, puedes considerar
también la combinación del daemon_generator [1] con la gema daemons [2],
donde generas el demonio mailer mediante :

script/generate daemon mailer

El plugin daemon_generator nos permite de una manera simple crear y
controlar demonios que se ejecutan dentro de nuestro código en el
ambiente
Rails, y con esto tenemos una solución multiplataforma. En este
[3] screencast se explica muy bien esto.

[1] GitHub - dougal/daemon_generator: A plugin for creating psuedo-scheduled jobs in Ruby on Rails.
[2] http://daemons.rubyforge.org/
[3] #129 Custom Daemon - RailsCasts

Un saludo.


Ror-es mailing list
[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Eso lo vas a tener en memoria y se va a ejecutar solo una vez al dia?

Yo en ese caso lo ejecutaria via cron. Pero vaya, para gustos los
colores.

On 20/10/2008, at 10:19, Jose Antonio P.
<[email protected]

Gracias a todos por vuestros consejos. Al final creo que me voy a
decantar por la opción de rake.
Lo que he hecho es crearme un tasks prueba.rake con esta estructura:

namespace :prueba do
desc “Manda mails de las alertas”
task(:send_mail => :environment) do
loop do
before = Time.now
yield # acciones que ejecuto
interval = 86400 - (Time.now - before) # 86400 seg = 1 dia
sleep(interval) if interval > 0
end
end
end

¿Qué os parece?

Hola,

Lo que he hecho es crearme un tasks prueba.rake con esta estructura:

  sleep(interval) if interval > 0

¿Qué os parece?

a mí no me parece mal, pero no estoy seguro de que sea una opción muy
eficiente (aunque lo mismo en tu caso no importa eso, depende de cómo
vayáis de máquinas).

tal cual tienes eso, vas a tener un proceso levantado continuamente,
consumiendo memoria, para ejecutar una sola cosa cada día. No sé, así de
entrada parece un poco excesivo tener un proceso para esto. Lo mismo te
sale más a cuenta lanzar ese proceso con un cron cada día

yo tengo una rake parecida a la tuya, sólo que la uso para lanzar todas
las tareas de fondo de la aplicación… y le puse el modo de funcionar
parecido al tuyo, pero viendo el uso real, acabé dejando un cron que la
ejecuta cada n minutos y saca todo lo que hay pendiente en cola… con
eso para mí es suficiente

saludos,


javier ramírez

…i do ruby on rails development in madrid, spain, at
http://www.aspgems.com
…you can find out more about me on http://formatinternet.wordpress.com
and http://workingwithrails.com/person/5987-javier-ramirez

Si has de ejecutar tareas en dias determinados no seria mejor que
utilizaras un cron con script/runner?

On 29/10/2008, at 17:16, Miguel Angel Calleja L.

Jaime Mora R.
escribió:> este [3] screencast se explica muy bien esto.

[email protected]
http://lists.simplelogica.net/mailman/listinfo/ror-es

Hola, estoy en la misma tesitura, necesito correr bajo background dos
códigos, uno que se ejecute semanalmente todos los lunes y otro el 10 de
cada mes.

He estado mirando el daemon_generator, después de ver no se cuántas
páginas y ver que el repositorio lo han cambiado, he bajado el plugin
desde la url que mencionas [1]. Lo he descomprimido y lo he metido en
vendor/plugins/daemon_generator tal como viene en ese enlace:

README
generators/
/daemons/
daemon_generator.rb
templates/
install.rb

Es correcto?

Luego he seguido las indicaciones:

script/generate daemon test

lib/daemons/test_ctl start

viendo el log de log/test.rb.log, me sale ésto:

*** below you find the most recent exception thrown, this will be likely
(but not certainly) the exception that made the application exit
abnormally ***
#<Errno::ENOENT: No such file or directory -
/home/intranet/desarrollo/log/test.rb.pid>
*** below you find all exception objects found in memory, some of them
may have been thrown in your application, others may just be in memory
because they are standard exceptions ***
#<NoMemoryError: failed to allocate memory>
#<SystemStackError: stack level too deep>
#<fatal: exception reentered>
#<LoadError: no such file to load – daemons>
#<LoadError: no such file to load – active_support>
#<Gem::Exception: can’t activate activesupport (= 2.0.2), already
activated activesupport-2.1.0]>
#<Errno::ENOENT: No such file or directory -
/home/intranet/desarrollo/log/test.rb.pid>

Es la primera vez que intento hacer un demonio de éstos, dice que no
existe test.rb.pid, existe uno que se llama test.rb_monitor.pid. Alguna
sugerencia?

Para ejecutar mis dós códigos el lunes semanalmente y el otro el 10 de
casa mes, es aconsejable usar este o algún otro? Gracias

[1] GitHub - dougal/daemon_generator: A plugin for creating psuedo-scheduled jobs in Ruby on Rails.

2008/10/30 Francesc E. [email protected]:

Si has de ejecutar tareas en dias determinados no seria mejor que
utilizaras un cron con script/runner?
Yo iba a proponer lo mismo…