Как начать новый процесс в Rails, без наследства текущих средств среды?

StackOverflow https://stackoverflow.com/questions/4009546

Вопрос

Я разрабатываю приложение Master Rails, которое контролирует другие приложения Rails. Он имеет сценарий Bash для начала этих приложений Rails, и он хорошо работает, пока он вызывается в командной строке вручную.

Но если я вызову это в приложении Rails, используя backticks, system, или exec, Сценарий потерпит неудачу.

Сообщение об ошибке:

unicorn_rails worker[0] -c ../configs/unicorns/c5.rb -E production must be run inside RAILS_ROOT:
 #<Gem::LoadError: can't activate rack (~> 1.0.0, runtime), already activated rack-1.2.1.
 Make sure all dependencies are added to Gemfile.>

А вот файл bash:

cp configs/Gemfile* $1
cd $1
bundle
bundle exec unicorn_rails -c ../configs/unicorns/$1.rb -E production

Как решить эту проблему?

Как вы можете видеть, я использую bundle exec Чтобы начать детский процесс, который должен иметь свои собственные драгоценные камни загружены, верно?

Это было полезно?

Решение

Переменные среды передаются ОС для рубины, когда она загружается. Ruby добавляет свои дополнительные переменные, затем начинает рельсы, которые добавляют еще больше.

Вы должны уметь манипулировать их, играя с Env Hash. Это отобразит то, что определено:

ENV.each { |key, val| puts "#{ key } => #{ val }"}

Вы можете настроить то, что передается до дочерних процессов, непосредственно изменив значения env, то вызывая код, который запускает ребенка:

ENV['PATH'] = '/path/to/application'
ENV['PATH'] # => "/path/to/application"

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top