2010-10-24 86 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

相关问题