ruby on rails - rufus - Rails cron siempre, configurando el entorno
sidekiq crontab (9)
Esta pregunta probablemente solo tenga sentido si conoce la gema "always" para crear trabajos cron. Tengo una tarea en mi schedule.rb como
every 1.day, :at => ''4am'' do
command "cd #{RAILS_ROOT} && rake thinking_sphinx:stop RAILS_ENV=#{RAILS_ENV}"
command "cd #{RAILS_ROOT} && rake thinking_sphinx:index RAILS_ENV=#{RAILS_ENV}"
command "cd #{RAILS_ROOT} && rake thinking_sphinx:start RAILS_ENV=#{RAILS_ENV}"
end
Sin embargo, cuando actualizo mi crontab usando
whenever --update-crontab appname --set environment=production
los trabajos cron todavía tienen RAILS_ENV = desarrollo. Mis tareas de producción y desarrollo son las mismas ahora, solo necesito cambiar la variable de entorno porque thinking_sphinx necesita conocer el entorno actual. ¿Alguna idea sobre cómo hacer esto?
¡Gracias!
Último siempre que permita una fácil integración de Capistrano. Puede agregar lo siguiente a deploy.rb:
set :whenever_environment, defer { stage }
set :whenever_identifier, defer { "#{application}-#{stage}" }
require "whenever/capistrano"
Agregue la siguiente línea de código en la parte superior de config / schedule.rb.
ENV[''RAILS_ENV''] = "#{@pre_set_variables[:environment]}"
y actualiza el crontab usando el siguiente comando.
whenever --update-crontab pvcnxt --set ''environment=production''
y luego reiniciar crontab usando el comando
service crond restart
¡Eso es!
Final config / schedule.rb se ve de esta manera
ENV[''RAILS_ENV''] = "#{@pre_set_variables[:environment]}"
env :PATH, ENV[''PATH'']
require File.expand_path(File.dirname(__FILE__) + "/environment")
set :output, "#{Rails.root}/logs/cron_log_#{ENV[''RAILS_ENV'']}.log"
every 1.day, :at => ''00:00 am'' do
command "cd #{Rails.root}/lib/tasks && rake clean__posts_table_rake"
end
Algo más que quieras probar si estás usando bundler y capistrano.
En su archivo deploy.rb, cuando configure el comando: whenever_mand, NO simplemente haga esto:
set :whenever_command, "bundle exec whenever"
En cambio, haz esto:
set(:whenever_command) { "RAILS_ENV=#{rails_env} bundle exec whenever" }
Ahora, la variable de entorno RAILS_ENV estará disponible cuando se cargue el archivo schedule.rb, de modo que en schedule.rb ahora puede hacer esto:
set :environment, ENV[''RAILS_ENV'']
Voila! Usted está listo para ir.
Consideraría usar el atajo "rake" para que sea aún más limpio:
every 1.day, :at => ''4am'' do
rake "thinking_sphinx:stop"
rake "thinking_sphinx:index"
rake "thinking_sphinx:start"
end
Estas preguntas han estado abiertas por mucho tiempo, así que pensé en compartir qué funcionaba cada vez que 0.9.7, Ruby 2.4.0 y RAILS 5.0.1. En la respuesta mencionada anteriormente hay muchos intentos cercanos, pero el error de sintaxis los ataca. Debajo está lo que funcionó y es un enfoque muy simple.
schedule.rb
require File.expand_path(File.dirname(__FILE__) + ''/environment'')
set :output, {:standard => ''log/cron_log.log'', :error => ''log/cron_error_log.log''}
env :PATH, ENV[''PATH'']
every :day, :at => ''10am'' do
rake "somejob:run", :environment => @environment
end
Actualiza el crontab (dev)
whenever --set ''environment=development'' --update-crontab
Resultados (dev)
0 10 * * * / bin / bash -l -c ''cd / my / rails / app && RAILS_ENV = paquete de desarrollo exec rake somejob: run --silent >> log / cron_log.log 2 >> log / cron_error_log.log''
Actualiza el crontab (prod)
whenever --set ''environment=production'' --update-crontab
Resultados (prod)
0 10 * * * / bin / bash -l -c ''cd / my / rails / app && RAILS_ENV = paquete de producción exec rake somejob: run --silent >> log / cron_log.log 2 >> log / cron_error_log.log''
Espero que esto pueda ayudar a alguien. Feliz Codificando esto!
No escriba la variable RAILS_ENV. Debería configurarlo automáticamente.
every 1.day, :at => ''4am'' do
command "cd #{RAILS_ROOT} && rake thinking_sphinx:stop"
command "cd #{RAILS_ROOT} && rake thinking_sphinx:index"
command "cd #{RAILS_ROOT} && rake thinking_sphinx:start"
end
Funciona en mi aplicación:
every 4.days do
runner "AnotherModel.prune_old_records"
end
$ whenever --set environment=production
0 0 1,5,9,13,17,21,25,29 * * /Users/weppos/Sites/git/app/script/runner -e production "AnotherModel.prune_old_records"
$ whenever --set environment=development
0 0 1,5,9,13,17,21,25,29 * * /Users/weppos/Sites/git/app/script/runner -e development "AnotherModel.prune_old_records"
Para Whenever (0.9.2)
Use la variable @environment
para verificar el entorno:
case @environment
when ''production''
every 1.minutes do
rake "user:take_sample"
end
when ''development''
every 1.minutes do
rake "user:dev_sample"
end
end
Siempre que no detecte su entorno, solo utiliza la producción de manera predeterminada. Puede establecer el entorno para todos los trabajos usando set:
set :environment, ''staging''
O por trabajo:
every 2.hours do
runner ''My.runner'', :environment => ''staging''
end
Tenga cuidado si quiere pasar más de un parametro a cada momento.
Tienes que hacerlo así:
whenever --update-crontab appname --set ''environment=production&cron_log=/path/to/log''