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

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

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

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

Ruby on Rails

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Q&A

解決済

1回答

6814閲覧

Railsのcontrollerからshコマンドの実行

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

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

Ruby on Rails

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

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

0グッド

0クリップ

投稿2016/02/12 10:01

###前提
AWSのデフォルトのAMIを使用して,その上でRuby on Railsを動かしています.
サンプルのプロジェクトをscaffoldでつくり,ブラウザから見ることができています.
また,実際にデータを登録して,editやupdate,deleteすることもできています.
ここまでは,Railsの通常のフローであると思います.

###発生している問題
controller内のcreateやshowなどといったメソッド内で,
外部コマンドを呼び出そうと思っているのですが,できません.
そもそも,こういったことはできないのでしょうか?

具体的には,/app/controller/内にあらかじめtest.shといった感じでshファイルを作っておき,
コントローラファイルcontroller.rbから呼び出すことを考えています.
(コントローラファイルとshファイルは同じディレクトリ内に存在しています)

以下のソースコードのような実行をやってみていますが,できません.
(Rails自体の実行ができなくなるわけではなく,単純にshファイルの実行のみがされていないという意味です)

###ソースコード

ruby

1def create 2 ... 3 %x( sh test.sh ) 4 `sh test.sh` 5 ... 6end

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

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

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

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

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

guest

回答1

0

ベストアンサー

実行までのパスを指定すれば実行できるかと思います。

# p`pwd` これで実行パスを出力できます。 `sh app/controllers/test.sh`

投稿2016/02/12 16:19

miyamiya

総合スコア691

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

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

退会済みユーザー

退会済みユーザー

2016/02/13 06:40 編集

ご回答ありがとうございます. やってみましたが,実行できませんでした. controller.rbもtest.shも,どちらも/home/rails/uploader/app/controllersに存在しているので, フルパスで指定してみましたが,できませんでした.
miyamiya

2016/02/13 16:04

p`pwd` Rails.logger.info `pwd` を試してみて画面かログに表示されますか。
退会済みユーザー

退会済みユーザー

2016/02/13 17:37

/home/rails/uploader/app/controllers内でplace.rbを作り,その中で p`pwd` Rails.logger.info `pwd` を実行すると,以下のようなログが出ました. $ ruby place.rb "/home/rails/uploader/app/controllers\n" place.rb:2:in `<main>': uninitialized constant Rails (NameError)
退会済みユーザー

退会済みユーザー

2016/02/13 17:52 編集

私の意図しているところでは,現状,ブラウザ上でブログのようなページとして見えており, ここで新規にレコード(例えば記事)を登録する際に,[Create]ボタンを押して登録しますが, その処理は一度controllerを経由するので, そのときに該当するメソッドdef create内にshファイルを実行するようにプログラムを記述しておけば, ボタンが押された時にshも実行されて,記事の登録も行われるという認識でしたが, これは正しいでしょうか?
miyamiya

2016/02/14 05:53

はい、正しいです。失敗するとすれば、メソッドが呼ばれていない、外部コマンド``が実行されていない、実行パスが誤って呼び出せない、shファイルで実行が失敗する、が考えられます。 ruby place.rbの実行結果からrubyでの外部コマンド``は成功しています。 Rails内で外部コマンドが成功するかを確認するには、 Rails.logger.info `pwd` をcreateの中で記述して、createボタンを押せば、ログにパス名が記録されるはずです。 Rails実行環境によっては、権限ユーザーが変わっている場合もあるので、shファイル実行で失敗している場合もあるかもしれません。
退会済みユーザー

退会済みユーザー

2016/02/14 06:14

ありがとうございます. ログの場所は,log/development.logで合っていますでしょうか?
退会済みユーザー

退会済みユーザー

2016/02/14 06:37

createの中で, logger.debug("aaa") p`pwd` logger.info( `pwd`) logger.debug("aaa") と記述してdevelopment.logを確認したところ, 該当部分に以下の様な記述がありました. aaa / aaa
退会済みユーザー

退会済みユーザー

2016/02/14 07:01 編集

また,詳しく調べましたところ, p`pwd` は効いておらず, Rails.logger.debug `pwd` は実行されていて / と出力されているようです. (追加) p`pwd`が効いていないというわけではないですね. 少なくとも,loggerとして出力した部分については, development.logに出力されていたというだけですね.
退会済みユーザー

退会済みユーザー

2016/02/14 06:51

実行権限という観点からですと, loggerによって/が出力されているので, もしかしたらルートディレクトリにおいてshを実行しようとしているのかもしれません. 実際のところ,今railsを実行しているユーザは, 一度suでrootになったあと,再度suでrailsというローカルユーザになってから, rails serverにて起動しております.
退会済みユーザー

退会済みユーザー

2016/02/14 07:04

/からディレクトリを移ろうと,rails内でcdをしたりもしてみましたが,うまくいかないようです. なにか解決策がありましたら,ご教授ください.
退会済みユーザー

退会済みユーザー

2016/02/17 15:34

どなたか解決策ございませんでしょうか? よろしくお願いいたします.
miyamiya

2016/02/17 16:42

/が出力されているということは、Rails内で外部コマンドが成功しています。 シェルの手動でcd / してからコマンドを実行してみて動くか試してみてください。 権限の問題なら一度 sudo をつけて実行みるといいかもしれません。
退会済みユーザー

退会済みユーザー

2016/02/20 11:28

シェルの中で,cdでフォルダを移る処理を記述しておくと,きちんと実行することができました. ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問