2010-10-24 3 views
0

Je développe une application de rails principaux qui contrôle d'autres applications de rails. Il a un script bash pour démarrer ces applications rails, et il fonctionne bien lorsqu'il est appelé manuellement dans la ligne de commande. Mais si je l'invoque dans l'application des rails, en utilisant backticks, system ou exec, le script échouera.Comment démarrer un nouveau processus dans Rails, sans hériter des variables d'environnement actuelles?

Le message d'erreur est:

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.>

Et voici le fichier bash:

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

Comment résoudre un problème comme celui-ci?

Comme vous pouvez le voir, j'utilise bundle exec pour lancer le processus fils, qui devrait avoir ses propres gemmes chargées, non?

Répondre

2

Les variables d'environnement sont transmises par le système d'exploitation à Ruby lors de son chargement. Ruby ajoute ses propres variables supplémentaires, puis démarre Rails, ce qui ajoute encore plus.

Vous devriez être capable de les manipuler en jouant avec le hachage ENV. Cela permet d'afficher ce qui est défini:

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

Vous pouvez modifier ce qui est transmis aux processus fils en modifiant directement les valeurs ENV invoquant alors le code qui commence l'enfant:

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

Modification du chemin, ou supprimer les entrées ENV non désirées pour limiter les connaissances de l'application enfant sur l'environnement est assez courant.

+0

Cela ne va-t-il pas affecter le processus parent en cours d'exécution? – Cheng

+1

Il pourrait, si vous le faites avant que le processus courant en cours a eu une chance d'analyser ENV. Si c'est un problème, copiez l'ENV actuel, modifiez-le et faites apparaître vos processus fils, puis restaurez-le. Les processus enfants doivent avoir leur propre copie de l'ENV limité à ce stade. –

+0

Cool, j'ai trouvé que vous pouvez simplement 'fork do {}' et changer ENV dans le 'fork fork' dans ruby ​​1.9. Je vous remercie! – Cheng

Questions connexes