質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

1回答

6746閲覧

シェルスクリプトからbundle execが実行できない

rifuch

総合スコア1901

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2016/05/17 03:46

###前提・実現したいこと
centOS6.5に、rvmとCapistranoを利用してデプロイした環境で、
centOSの起動スクリプト(/etc/init.d/hoghoge)からunicornを起動したいと思い、
シェルスクリプトを書きました。
しかし、unicorn起動のためのコマンドの、bundle exec unicornの部分でエラーが発生してしまいます。

なお、デプロイは正常に行われ、unicornも起動できています。

###発生している問題・エラーメッセージ
下記シェルをsudoで実行したときに、以下のメッセージが出て先に進みません。

$ sudo /etc/init.d/hogehoge start Could not find rake-10.4.2 in any of the sources Run `bundle install` to install missing gems.

###該当のソースコード

bin/sh

1#!/bin/sh 2# 3# chkconfig: - 85 15 4 5. /etc/rc.d/init.d/functions 6 7PROG_NAME=hogehoge 8USER=execute_user 9 10APP_ROOT=/home/execute_user/hogehoge 11RAILS_ENV=staging 12 13PID_FILE="/var/run/hogehoge/unicorn.pid" 14CONFIG_FILE=$APP_ROOT/current/config/unicorn/$RAILS_ENV.rb 15CMD="cd $APP_ROOT/current && (RAILS_ENV=$RAILS_ENV bundle exec unicorn -c $CONFIG_FILE -D -E $RAILS_ENV )" 16 17cd $APP_ROOT/current || exit 1 18 19case $1 in 20 start) 21 su $USER -c "$CMD" 22 ;; 23 stop) 24 killproc -p $PID_FILE $PROG_NAME -QUIT 25 ;; 26 restart) 27 killproc -p $PID_FILE $PROG_NAME -USR2 28 ;; 29 *) 30 echo >&2 "Usage: $0 <start|stop|restart>" 31 exit 1 32 ;; 33esac

###試したこと
sshでexecute_userにログインし、上記スクリプトの$CMDと同じコマンドを発行したときは正常動作します。
環境変数のGEM_HOME,GEM_PATHあたりが怪しいかと思い、そのあたりの確認のために、
上記スクリプトの$CMDを
"cd $APP_ROOT/current && printenv && (RAILS_ENV=$RAILS_ENV bundle exec unicorn -c $CONFIG_FILE -D -E $RAILS_ENV )"
に変更して環境変数を出力し、sshでログインしたexecute_userのprintenvと見比べてみたのですが、特に異なった所はありません。

また、sudo権限を持つユーザーでsshログインして、
sudo su - execute_user -c "bundle exec 'ruby -e $LOAD_PATH'"
等として見ても、bundle exec実行の際に上記エラーで止まってしまいます。

オプションでbundlerを選べるのかとか考え、
sudo su - execute_user -c "BUNDLE_BIN_PATH=/home/execute_user/.rvm/rubies/2.1.5/bin bundle exec 'ruby -e $LOAD_PATH'"
等ともやってみるのですが、結果は同様です。

###補足情報(言語/FW/ツール等のバージョンなど)
CentOS 6.5
rvm 1.26.11
rvm ruby 2.1.5
rails 3.2.22

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

このリンク先の情報は役に立つでしょうか。
Could not find XXXX in any of the sources エラーの修正方法 - Qiita

投稿2016/05/17 04:04

unau

総合スコア2468

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rifuch

2016/05/17 04:26 編集

回答ありがとうございます。 リンク先の情報はすでにとらえており、この場合、シェルコマンドから発行するbundleがエラーを吐く際には有効でも、シェルからsudoした時の問題解決にはならないかと思い、試してはいません。 ちなみに、sshログインしたexecute_userで、bundle show rake をすると /home/execute_user/hogehoge/shared/bundle/ruby/2.1.0/gems/rake-10.4.2 と出ますが、 sudoユーザーでログインして、 sudo su - execute_user -c "cd /home/execute_user/hogehoge && bundle show rake した時には、 Could not find rake-10.4.2 in any of the sources とでます。 su - した時にbudlerがどこのgemを見に行っているのかもわからない状態です。 ちなみに、execute_userでsshログインしたときにwhich bundleした時と、 sudoユーザーで sudo su - execute_user -c "cd /home/execute_user/hogehoge/current && which bundle" した時の結果は、それぞれ ~/.rvm/gems/ruby-2.1.5/bin/bundle /home/execute_user/.rvm/gems/ruby-2.1.5/bin/bundle と、同じ結果が出ます。
unau

2016/05/17 07:14

ruby も rails もあまり知らないのですが、違いが出るとしたら実行ユーザ、環境変数、実行ディレクトリのどれかが違う、としか考えにくいですよね。 /etc/init.d/hogehoge 内の CMD ではサブシェルで bundle を実行する際、環境変数 RAILS_ENV を設定していますので、printenv で環境変数を調べるときも CMD="cd $APP_ROOT/current && (RAILS_ENV=$RAILS_ENV printenv)" とするといいかな、と思いますが ...
rifuch

2016/05/17 09:30

アドバイスありがとうございます。 アドバイス頂いた通り、環境変数を追加した上でprintenvして見ましたが、RAILS_ENVが追加されただけでした。 コマンド内でsuしているのでユーザーは一緒、cdでディレクトリも合わせている、環境変数も見比べてみたところ違いは無し。環境変数は真っ先に疑ったのですが、出てきた結果に違いがなくて困ってます。 シェルコマンドがあまり得意ではなくて、sshで直にログインするのと、sudoからのsu -とで、どんな違いが出るかがよくかわかってないです。
unau

2016/05/17 16:44

ssh でログインした状態は、たとえばそのユーザのログインシェルが bash だとすると、対話モードの bash になるので ~/.bashrc が実行される、sudo su - user command や sudo -u user -c command でどうなのか、よくわかっていませんが、実行ユーザ・環境変数・実行ディレクトリが一緒なら同じ動作になりそうなものです。あと、エイリアスや独自の関数が定義されているとコマンドの動作が変わる可能性がありますが ...。 うーむ、あまりお役に立てずに申し訳ありません。
rifuch

2016/05/18 09:35

コメントありがとうございます。 requeireするgemをコントロールするBudler(bundle execでコールされる)が、環境変数を書き換える事で最適なgemをrequireする仕掛けになっているのですが、このBundlerが想定外の動作をしているらしき所までは突き止めたんですが・・・ これがsuやsudoとどう関係して想定外の動きをしているのかまではわからないのが現状です。
rifuch

2016/05/25 15:09

結局、別途インストールしていた暗号化ツールが悪影響していたのがオチでした。 諸々アドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問