Подтвердить что ты не робот

Rails cron с любой настройкой среды

Этот вопрос, вероятно, будет иметь смысл, если вы знаете о каждом драгоценном камне для создания заданий cron. У меня есть задача в моем schedule.rb, например

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

Однако, когда я обновляю свой crontab, используя

whenever --update-crontab appname --set environment=production

задания cron по-прежнему имеют RAILS_ENV = развитие. Мои задачи по производству и разработке сейчас одни и те же, мне просто нужно изменить переменную среды, потому что think_sphinx должен знать текущую среду. Любые идеи о том, как это сделать?

Спасибо!

4b9b3361

Ответ 1

Я бы подумал об использовании ярлыка "rake", чтобы сделать его еще более чистым:

every 1.day, :at => '4am' do
  rake "thinking_sphinx:stop"
  rake "thinking_sphinx:index"
  rake "thinking_sphinx:start"
end

Ответ 2

Всякий раз, когда вы не обнаруживаете свою среду, она просто по умолчанию использует производство. Вы можете установить среду для всех заданий с помощью set:

set :environment, 'staging' 

Или за задание:

every 2.hours do 
  runner 'My.runner', :environment => 'staging' 
end 

Ответ 3

Не записывайте переменную RAILS_ENV. Он должен установить его автоматически.

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

Он работает в моем приложении:

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"

Ответ 4

Что-то еще, что вы можете попробовать, если вы используете bundler и capistrano.

В вашем файле deploy.rb, когда вы устанавливаете: when_command, DO NOT просто выполните это:

set :whenever_command, "bundle exec whenever"

Вместо этого сделайте следующее:

set(:whenever_command) { "RAILS_ENV=#{rails_env} bundle exec whenever" }

Теперь переменная среды RAILS_ENV будет доступна, когда файл schedule.rb будет загружен, поэтому в sched.rb вы можете теперь сделать это:

set :environment, ENV['RAILS_ENV']

Voila! Вы готовы пойти.

Ответ 5

Для Whenever (0.9.2)

Используйте переменную @enviroment для проверки окружения:

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

Ответ 6

Остерегайтесь, если вы хотите передать больше, чем один параметр. Вы должны сделать это так:

whenever --update-crontab appname --set 'environment=production&cron_log=/path/to/log'

Ответ 7

Последний раз когда позволяет легко интегрировать Capistrano. Вы можете добавить следующее в deploy.rb:

set :whenever_environment, defer { stage }
set :whenever_identifier, defer { "#{application}-#{stage}" }

require "whenever/capistrano"

Ответ 8

Эти вопросы были открыты долгое время, поэтому я подумал, что буду делиться тем, что сработало с 0.9.7, Ruby 2.4.0 и RAILS 5.0.1. В вышеупомянутом ответе есть много близких попыток, но синтаксическая ошибка поражает их. Ниже приведена работа и очень простой подход.

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

Обновить crontab (dev)

whenever --set 'environment=development' --update-crontab

Результаты (DEV)

0 10 * * */bin/ bash -l -c 'cd/my/rails/app && & RAILS_ENV = пакет разработчика exec rake somejob: run --silent → log/cron_log.log 2 → log/cron_error_log.log '

Обновить crontab (prod)

whenever --set 'environment=production' --update-crontab

Результаты (прод)

0 10 * * */bin/ bash -l -c 'cd/my/rails/app && & RAILS_ENV = производственный пакет exec rake somejob: run --silent → log/cron_log.log 2 → log/cron_error_log.log '

Надеюсь, это может помочь кому-то. Счастливое кодирование этого!

Ответ 9

Добавьте следующую строку кода вверху config/schedule.rb.

 ENV['RAILS_ENV'] = "#{@pre_set_variables[:environment]}"

и обновите crontab, используя следующую команду.

whenever --update-crontab pvcnxt --set 'environment=production'

а затем, наконец, перезапустите crontab, используя команду

service crond restart

Вот оно!

Final config/schedule.rb выглядит следующим образом

 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