Вопрос по ruby-on-rails – Rails cron с настройкой среды

31

Этот вопрос, вероятно, будет иметь смысл только в том случае, если вы знаете о камне для создания заданий 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 должен знать текущую среду. Есть идеи, как это сделать?

Спасибо!

В моем конкретном случае (начиная с delayed_job) я получил это с помощьюcommand "RAILS_ENV=#{@environment} #{Whenever.path}/bin/delayed_job start" Besi
Если вы запускаете рейк, вы также можете использоватьrake командование вwhenever контекст. Besi

Ваш Ответ

9   ответов
6

поэтому я подумал, что поделюсь тем, с чем работали всякий раз, когда 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
Update the crontab(dev)
whenever --set 'environment=development' --update-crontab
Results(dev)

0 10 * * * /bin/bash -l -c 'cd /my/rails/app && RAILS_ENV=development bundle exec rake somejob:run --silent >> log/cron_log.log 2>> log/cron_error_log.log'

Update the crontab(prod)
whenever --set 'environment=production' --update-crontab
Results(prod)

0 10 * * * /bin/bash -l -c 'cd /my/rails/app && RAILS_ENV=production bundle exec rake somejob:run --silent >> log/cron_log.log 2>> log/cron_error_log.log'

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

env: PATH, ENV ['PATH'} ??
-1

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

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

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

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

service crond restart

Это оно!

окончательный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
-6

чтобы сделать его еще чище:

every 1.day, :at => '4am' do
  rake "thinking_sphinx:stop"
  rake "thinking_sphinx:index"
  rake "thinking_sphinx:start"
end
@ Тони Вам нужно изменить правильный ответ
Обратите внимание, чтоrake командаdoes на самом деле добавитьRAILS_ENV к команде, которая заканчивается вcrontab.
Не отвечает на вопрос вообще.
Этот ответ не говорит о том, как изменить окружающую среду, он просто дает способ сделать задачу более чистой. Проверьте ответ Trung LE для реального способа сделать это
8

если вы хотите передать более одного параметра в любое время.
Вы должны сделать это так:

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

и.

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"
16

если используете bundler и capistrano.

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

set :whenever_command, "bundle exec whenever"

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

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

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

set :environment, ENV['RAILS_ENV']

Вуаля! Вы готовы к работе.

Я получил это: fail: & quot; sh -c 'cd (REMOVED) / Releases / 20140127213854 & amp; RAILS_ENV = производственный пакет exec всякий раз, когда --update-crontab (REMOVED) --set environment = production --roles db & quot; на (УДАЛЕНО)
86

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

set :environment, 'staging' 

Или за работу:

every 2.hours do 
  runner 'My.runner', :environment => 'staging' 
end 
я могу передать массив вenvironment Нужно ли устанавливать несколько сред?
Надо пометить как правильный ответ
Да, это сработало, действительно очень спасибо!
Я надеюсь, что это сработало!
6

добавить следующее в deploy.rb:

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

require "whenever/capistrano"
16

Whenever (0.9.2)

Использовать@environment переменная для проверки среды:

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
Это просто работает в0.9.7
Обратите внимание, однако, что переменная @environment всегда является «продукцией»; по умолчанию. Ты долженwhenever --set environment=development --write-crontab когда выплюнешь свою работу и тогда этот ответ сработает.

Похожие вопросы