2010-10-24 59 views
0

我正在開發控制其他rails應用程序的主軌應用程序。它有一個bash腳本來啓動這些rails應用程序,並且它在手動調用命令行時運行良好。如何在Rails中啓動一個全新的進程,而不繼承當前的環境變量?

但是,如果我在事件欄應用程序中調用它,使用backticks,systemexec,腳本將失敗。

的錯誤信息是:

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開始子進程,它應該有它自己的寶石加載,對吧?

回答

2

環境變量在加載時由OS傳遞給Ruby。 Ruby增加了自己的附加變量,然後啓動Rails,這增加了更多。

您應該可以通過使用ENV散列來操縱它們。這將顯示的內容定義:

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

你可以調整什麼是直接修改ENV值,則調用該啓動子的代碼傳遞給子進程:

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

修改路徑,或剝離不需要的ENV條目以限制子應用程序對環境的瞭解是非常普遍的。

+0

這不會影響正在運行的父進程嗎? – Cheng 2010-10-25 09:55:45

+1

它可以,如果你在當前正在運行的進程有機會解析ENV之前這樣做。如果這是一個問題,那麼複製當前的ENV,調整它併產生你的子進程,然後恢復它。在這一點上,兒童進程應該有他們自己的有限ENV的副本。 – 2010-10-25 21:16:56

+0

很酷,我發現你可以簡單的'fork do {}'並在ruby 1.9中改變'fork block'中的ENV。謝謝! – Cheng 2010-10-26 17:26:36

相關問題