2012-03-23 21 views
21

Tengo una aplicación Rails implementada en Heroku con el complemento del programador Heroku funcionando con éxito para trabajos diarios.¿Cómo puedo programar un trabajo 'semanal' en Heroku?

Ahora quiero un trabajo semanal, pero el complemento del programador no me permite una opción semanal.

¿Alguna sugerencia sobre cómo podría lograr esto:

  • He intentado usar rufus-programador en el pasado pero me causaron algunos problemas, así que no es una opción. Ver here para más detalles.
  • Estoy pensando en algo parecido a verificar el día actual dentro de un trabajo diario. ¿Alguien lo ha probado y tiene comentarios o sabe de problemas con el enfoque?
  • Otras ideas muy apreciadas.

Respuesta

35

Un enfoque sería el de su segundo punto:

activar el cron Heroku complemento, y añadir una tarea cron.rake en app/lib/tasks

activar el planificador Heroku complemento y añadir una tarea scheduler.rake en app/lib/tasks

task :your_weekly_task=> :environment do 
    if Time.now.friday? # previous answer: Date.today.wday == 5 
    #do something 
    end 
end 

incluso tiene el lujo de definir el día que desea r tarea para ejecutar; o) (5 es para el viernes)

EDITAR: por cierto, Cron está en desuso y Heroku recomienda cambiar a su complemento Scheduler. Sin embargo, esto no cambia el enfoque para un trabajo semanal.

EDIT2: ajustes en mi respuesta basados ​​en los comentarios de sunkencity.

+3

El complemento cron está en desuso y se suspenderá a favor del programador. Dicho esto, el enfoque que sugieres es sólido, pero podría formularse mejor con active support: Time.now.friday. – sunkencity

+0

Me da pena la idea de programar el día, así que dejo la pregunta abierta por ahora para una mejor alternativa. –

+0

Btw, lo que hago es que utilizo una configuración de var herook para el día de la semana para ejecutar. Luego debe controlar la hora del día a través de la IU. Es realmente * no * genial. Equipo de Heroku, si estás ahí y lee esto, mejora el programador. No tiene que tener toda la flexibilidad de cron. Pero, al menos hazlo donde puedas programar trabajos semanales y mensuales. –

8

No es ideal, pero he comenzado a agregar una variable de entorno RUN_IF para rake tareas ejecutadas a través de heroku: planificador que me permite programar planificaciones semanales y mensuales para trabajos.

# lib/tasks/scheduler.rake 
def run? 
    eval ENV.fetch('RUN_IF', 'true') 
end 

def scheduled 
    if run? 
    yield 
    else 
    puts "RUN_IF #{ENV['RUN_IF'].inspect} eval'd to false: aborting job." 
    end 
end 

# lib/tasks/job.rake 
task :job do 
    scheduled do 
    # ... 
    end 
end 

Si se ejecuta una tarea de rake sin una variable RUN_IF, se ejecutará. De lo contrario, el trabajo se cancelará a menos que el valor de RUN_IF evalúe a un valor falsey.

$ rake job        # => runs always 
$ rake job RUN_IF='Date.today.monday?' # => only runs on Mondays 
$ rake job RUN_IF='Date.today.day == 1' # => only runs on the 1st of the month 
$ rake job RUN_IF='false'    # => never runs (not practical, just demonstration) 

Similar a otras ideas anteriores, pero prefiero mover los detalles de programación fuera del código de la aplicación.

+0

¡Gran solución! – bnussey

0

Si usted no quiere o no puede hacer esto con el rastrillo, otra opción es hacer esto con Ruby de fiesta:

#!/bin/bash 

cmd="echo your schedule job here" 

# Only run on even days 
ruby -e 'if Time.now.utc.day.even?; puts "Not today!"; exit 1; end' && $cmd "[email protected]" 

Esto funciona incluso para los proyectos no-rubí (como en mi caso: Clojure)

9

Opción alternativa que utiliza solo código de shell.Configuración del planificador Heroku por hora, y hacer una comparación con el comando date:

# setting the schedular to run hourly at *:30 is equivalent to the 
# crondate: 30 8 * * 1 
if [ "$(date +%H)" = 08 ] && [ "$(date +%d)" = 01 ]; then YOUR_COMMAND ; fi 

He utilizado este código para imitar cron en mi zona horaria local:

nz_hour="$(TZ=NZ date +%H)" ; nz_day="$(TZ=NZ date +%d)" ; if [ "$nz_hour" = 08 ] && [ "$nz_day" = 01 ]; then YOUR_COMMAND ; fi 
1

Como se ha expuesto over here, y el uso de la lógica anterior de Rob, aquí están los scripts bash desglosados ​​por un día de la semana, una vez al mes y en una fecha específica.

ejecutar una tarea cada lunes:

if [ "$(date +%u)" = 1 ]; then MY_COMMAND; fi 

ejecutar una tarea cada 1 día en un mes:

if [ "$(date +%d)" = 01 ]; then MY_COMMAND; fi 

También puede ejecutar un trabajo cada año el 24 de diciembre:

if [ "$(date +%m)" = 12 ] && [ "$(date +%d)" = 24 ]; then MY_COMMAND; fi 
Cuestiones relacionadas