2011-09-25 11 views
14

Tengo una aplicación que contiene un montón de tareas, y todos los días quiero ejecutar un trabajo cron que crea un DayTask para cada tarea en la base de datos. Una tarea tiene muchos turnos de día y estas tareas diarias son lo que los usuarios van a marcar todos los días. Estoy usando la gema de "always" pero parece que no se está ejecutando en absoluto. ¿Algunas ideas?El trabajo cron no funciona en Whenever gem

config/schedule.rb

every 1.day, :at => "12:01am" do 
    runner "Task.generate_tasks_for_day" 
end 

Task.rb

def generate_tasks_for_day 
    Task.all.each do |task| 
     task.day_tasks.create(:target_date => Date.today) 
    end 
    end 

resultado de ejecutar el comando 'siempre que'

1 0 * * * /bin/bash -l -c 'cd /home/grant/rails_projects/GoalTwist && script/rails runner -e production '\''Task.generate_tasks_for_day'\''' 

Nota: He estado cambiando los tiempos en config/schedule.rb cada vez que quiero probar ejecutarlo.

+0

puede comprobar que, cuando dicen "resultado de ejecutar el" siempre que el mandamiento de" haber comprobado también que esto es en' crontab -l'? Además, ¿en qué sistema operativo está esto? Normalmente, ejecutaría mi servidor en UTC y me aseguraré de que cada vez que utilice su zona horaria local lo convierta a horas UTC. –

+0

# Comenzar Siempre que se generen tareas para: daytask 42 18 * * */bin/bash -l -c 'cd/home/grant/rails_projects/GoalTwist && script/rails runner -e production' \ '' Task.generate_tasks_for_day '\ '' ' # End Siempre que haya generado tareas para: daytask Estoy ejecutando Linux Mint. Y gracias por el aviso sobre la diferencia de la zona horaria. –

Respuesta

60

Finalmente he resuelto cómo ejecutar la gema cuando sea necesario. Está funcionando bien en producción, pero no en modo de desarrollo (creo que para trabajar bien en el modo dev debes hacer algunos trucos).

Entonces, estos son los procesos que ver:

  1. instalar la gema
  2. escriba su scheduler.rb archivo
  3. empuje para el servidor remoto
  4. de inicio de sesión al servidor remoto (por ejemplo, con ssh)
  5. ver si siempre se carga correctamente al ejecutar en la terminal: whenever
  6. actualización cada vez crontab ejecutando: whenever --update-crontab
  7. reiniciar el crontab servidor (por ejemplo, en el servidor de Ubuntu): sudo service cron restart
  8. verificación si crontab está bien implementado en el servidor: crontab -l

eso es todo!

Personalmente, prefiero configurar mis crons directamente desde el servidor:

  1. Editar crontab: crontab -e
  2. Anexar mi cron (por ejemplo,todos los días a las 5:00 PM - puede ser poco diferente para servidor no-basados ​​en Linux):
    0 5 * * * /bin/bash -l -c 'cd /path_to_my_app/current && RAILS_ENV=production bundle exec rake my_cron_rake'
  3. Comprobar si bien implementada: crontab -l
  4. Hecho
+2

¡Gracias! No entendí muy bien cómo funcionó al principio. Esperaba más magia;) –

+0

@Zenph yo también;) – damoiser

+2

No entiendo por qué ni sidekiq o cada vez que menciona 'siempre --update-crontab' – TalkativeTree

0

Intente ejecutar el comando siempre que se genere directamente desde el terminal o agregue la siguiente línea [email protected] a su crontab.

+0

Agregué esa línea a mi crontab ... Sin correo electrónico. –

+0

¿Se generan las tareas diarias cuando llama al método desde la consola de rieles? En caso afirmativo, ha intentado iniciar sesión en su servidor de producción y ejecutar '/ bin/bash -l -c 'cd/inicio/grant/rails_projects/GoalTwist && script/rails runner -e producción' \ '' Task.generate_tasks_for_day ' \ '' ''? – Hugo

3

Usted tiene que registrarse en realidad el trabajo con el crontab ejecutando:

whenever --update-crontab

Además, si usted está tratando de obtener puestos de trabajo que se ejecutan localmente, añadir :environment => "development" a su tarea

runner "MyTask.some_action", :environment => "development"

Cuestiones relacionadas