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

Спасибо!


person Tony    schedule 01.07.2009    source источник
comment
В моем конкретном случае (начало delayed_job) я заработал, используя command "RAILS_ENV=#{@environment} #{Whenever.path}/bin/delayed_job start"   -  person Besi    schedule 06.07.2018
comment
Если вы запускаете rake, вы также можете использовать команду rake в контексте whenever.   -  person Besi    schedule 06.07.2018


Ответы (10)


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

every 1.day, :at => '4am' do
  rake "thinking_sphinx:stop"
  rake "thinking_sphinx:index"
  rake "thinking_sphinx:start"
end
person Community    schedule 29.07.2009
comment
Этот ответ не говорит, как изменить среду, он просто дает возможность сделать задачу чище. Проверьте ответ Trung LE, чтобы узнать, как это сделать. - person DallaRosa; 19.12.2012
comment
Вообще не отвечает на вопрос. - person Benjamin Harel; 23.02.2016
comment
Обратите внимание, что команда rake действительно добавляет RAILS_ENV к команде, которая заканчивается crontab. - person Besi; 06.07.2018

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

set :environment, 'staging' 

Или по работе:

every 2.hours do 
  runner 'My.runner', :environment => 'staging' 
end 
person Trung LE    schedule 03.09.2010
comment
могу ли я передать массив в environment для установки нескольких сред? - person mrudult; 27.02.2014
comment
Это неправильный способ, когда мы имеем дело с несколькими средами. - person Franchy; 30.07.2019

Не записывайте переменную 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"
person Simone Carletti    schedule 01.07.2009

Для 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
person yogendra689    schedule 30.04.2014
comment
Обратите внимание, однако, что переменная @environment по умолчанию всегда является рабочей. Вы должны whenever --set environment=development --write-crontab выплевывать свои задания, и тогда этот ответ сработает. - person Mike A; 10.07.2014

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

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

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']

Вуаля! Вы готовы идти.

person Tim Lowrimore    schedule 07.02.2011
comment
Я получил это: не удалось: sh -c 'cd (УДАЛЕНО)/релизы/20140127213854 && RAILS_ENV=production bundle exec всякий раз, когда --update-crontab (УДАЛЕНО) --set environment=production --roles db' on (УДАЛЕНО) - person Pavan Katepalli; 28.01.2014

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

расписание.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

Результаты (разработка)

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'

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

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

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

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'

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

person Jon R.    schedule 02.03.2017
comment
env :PATH, ENV['PATH'} ?? - person NamNamNam; 02.11.2017

Будьте осторожны, если вы хотите передать более одного параметра в when.
Вы должны сделать это следующим образом:

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

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

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

require "whenever/capistrano"
person Laurynas    schedule 29.05.2011

У меня была проблема, когда среда не настраивалась всякий раз, когда задания cron - /usr/bin/bundle выбирались вместо /usr/local/bin/bundle.

Решение состояло в том, чтобы добавить следующее в начало schedule.rb

env 'PATH', ENV['PATH']
person Snips    schedule 31.05.2019

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

 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
person Satishakumar Awati    schedule 02.12.2015