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?
Cela ne va-t-il pas affecter le processus parent en cours d'exécution? – Cheng
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. –
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