Forum: Rails-ES Tareas periodicas

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
98ee355266e55690050a20fd76ee8c67?d=identicon&s=25 Jose Antonio Parra (pikislabis)
on 2008-10-09 10:52
 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!
0e6c0ba9935b52866fd5c54dd886cf2e?d=identicon&s=25 Jaime Iniesta (Guest)
on 2008-10-09 11:08
(Received via mailing list)
2008/10/9 Jose Antonio Parra <ruby-forum-incoming@andreas-s.net>

> 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.
F625b891618be8ec32547a07b3192bb0?d=identicon&s=25 Francesc Esplugas (fesplugas)
on 2008-10-09 11:22
(Received via mailing list)
2008/10/9 Jaime Iniesta <jaimeiniesta@gmail.com>:

> 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
90ea347c45cdfbc1c5767dd6304d9c10?d=identicon&s=25 Borja Martín (Guest)
on 2008-10-09 11:38
(Received via mailing list)
¿Y cómo veis la combinación starling + workling ?
http://railscasts.com/episodes/128-starling-and-workling

Saludos

Francesc Esplugas escribió:
F625b891618be8ec32547a07b3192bb0?d=identicon&s=25 Francesc Esplugas (fesplugas)
on 2008-10-09 11:50
(Received via mailing list)
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.
33a24a134536b312b0d5334c2a9152db?d=identicon&s=25 Pablo Formoso Estrada (Guest)
on 2008-10-09 12:34
(Received via mailing list)
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.
98ee355266e55690050a20fd76ee8c67?d=identicon&s=25 Jose Antonio Parra (pikislabis)
on 2008-10-09 12:38
 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

 http://www.aota.net/Script_Installation_Tips/cronhelp.php3

 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 Esplugas 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.
33a24a134536b312b0d5334c2a9152db?d=identicon&s=25 Pablo Formoso Estrada (Guest)
on 2008-10-09 12:47
(Received via mailing list)
_______________________________________________
Ror-es mailing list
Ror-es@lists.simplelogica.net
http://lists.simplelogica.net/mailman/listinfo/ror-es
9baec5b20d55fcdced48dadd94d96db5?d=identicon&s=25 Jaime Mora Ramones (Guest)
on 2008-10-20 05:51
(Received via mailing list)
El 9 de octubre de 2008 2:52, Jose Antonio Parra <
ruby-forum-incoming@andreas-s.net> 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]  http://github.com/dougal/daemon_generator/tree/master
[2] http://daemons.rubyforge.org/
[3] http://railscasts.com/episodes/129-custom-daemon

Un saludo.
98ee355266e55690050a20fd76ee8c67?d=identicon&s=25 Jose Antonio Parra (pikislabis)
on 2008-10-20 10:19
 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?
F625b891618be8ec32547a07b3192bb0?d=identicon&s=25 Francesc Esplugas (fesplugas)
on 2008-10-20 10:43
(Received via mailing list)
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 Parra
<ruby-forum-incoming@andreas-s.net
1f2eadfb41362800ebc2cf211b91d0f7?d=identicon&s=25 javier ramirez (Guest)
on 2008-10-20 10:50
(Received via mailing list)
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
Aebf4e72990aa0bbfcb782d65bf5200f?d=identicon&s=25 Miguel angel Calleja lázaro (migue)
on 2008-10-29 17:16
(Received via mailing list)
Jaime Mora Ramones
escribió:> este [3]  screencast se explica muy bien esto.
> Ror-es@lists.simplelogica.net
> 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] http://github.com/dougal/daemon_generator/tree/master
F625b891618be8ec32547a07b3192bb0?d=identicon&s=25 Francesc Esplugas (fesplugas)
on 2008-10-30 07:51
(Received via mailing list)
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 Lazaro
7f82e7eaa0037b12d844f888afd0398c?d=identicon&s=25 Dani Doni (Guest)
on 2008-10-30 09:00
(Received via mailing list)
2008/10/30 Francesc Esplugas <francesc.esplugas@gmail.com>:
>
> Si has de ejecutar tareas en dias determinados no seria mejor que
> utilizaras un cron con script/runner?
Yo iba a proponer lo mismo...
This topic is locked and can not be replied to.