2012-03-28 6 views
0

私はRubyスクリプトをJavaで実行しようとすると実際の問題を抱えています。私はあらゆる種類のソリューションを提案しており、何らかの理由でそれらのすべてが失敗しているので、問題を単純化しようとしています。シェル/ターミナルからのスクリプトの呼び出しとJavaプロセスの使用の違いは何ですか?

のは、私はそれでこのラインを持っているシェルスクリプトがあるとしましょう:端末で

ruby -rubygems script/test_s2t.rb 

を、私はscript/runruby.shを使用して、このスクリプトを実行することができますし、期待どおりに動作します。今度は、私は次のことを行いJavaメソッドを持っているとしましょう:

String[] cmd = {"script/runruby.sh"}; 
ProcessBuilder builder = new ProcessBuilder(cmd); 
builder.redirectErrorStream(true); 
Process process = builder.start(); 

これは(それは具体的には、バックRubyスクリプトからエラーがスローされますが、それは本当にダウンスクリプトにだから、これがmisdirectでは動作しません。それ自体は期待通りに動作しません)。なぜ私は実際の問題から私を邪魔していると思うので、私の質問は、test_s2t.rbスクリプトが動作しない理由ではありません。

私の質問は単純にです。コマンドラインで実行するのではなく、ProcessBuilderで何かを実行すると何が違うのですか?それは許可のものですか?パスの違い?スクリプト自体に問題は見られないので、スクリプトが実行されている環境に何か不具合があるはずです。

alwyasとして、どんな提案もありがたいです。三日、この問題を頼りに...

EDIT - 好奇心のために、私はJavaで受け取る正確なエラーがこの質問の下部に説明したものです:Java receives an error executing Ruby script; Terminal doesn't

我々はその質問に入った結果私はJRubyを試してみるべきだったが、それはJRuby内で宝石を正しく動作させることができないので、さらなる問題を引き起こした。だから私はなぜそれが最初に正常に動作しないのか自分に尋ねることに戻りました。

私はエラーが気になると思うのは、見逃すと思われる文字列を処理したためにエラーが発生したためです。予想される文字列は、ffmpegなどを使用しているスクリプトが実行する通常のプロセスです。これは、スクリプトに別のエラーが発生したことを示しています(これは表示されていません。つまり、おそらくruby/jrubyによって引き起こされたのではなく、スクリプトがffmpegのように起動するプロセスによるものです)。

これは非常にイライラしています。純粋にコマンドラインから完全に実行されるからです。

+0

実際の問題から気を散らしているかもしれませんが、スクリプトから得られるエラーは何ですか? ProcessBuilderはそれ自身と同じ*環境のプロセスを実行します – ArjunShankar

+0

私はエラーといくつかの説明を編集します。完了しました。 – mtrc

答えて

2

私は同様の問題に遭遇してきたし、共通の問題であるように見える二つのものがあります:

1)は、子プロセスの環境は、現在の仮想マシンの環境と同じになります。これには、起動したプロセスの作業ディレクトリが含まれます。

例から:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html

Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory("myDir"); 

代わりに、シェルスクリプト内の環境を設定することができます。

2)あなたは適切なシバン#をお持ちですか? .shファイルの先頭に?個人的には絶対に明示して、おそらく明示的にbashやzshなどのシェルスクリプトのパスを最初の引数として呼び出すか、引数として '-rubygems'と 'script/test_s2t.rb'を使って直接rubyを呼び出します。

Good Luck!

+0

これらのおかげで - 明日彼らを試して、あなたに戻ってきます! – mtrc

+0

2番目の提案について - 私は実際にこのRuby呼び出しをスクリプトに移しましたので、質問を単純化することができました。以前はRubyを直接呼び出そうとしましたが、ダイスは呼び出しませんでした。だから、私はそうは思わない。私は地元の環境を調査します。作業ディレクトリは正常ですが、おそらくいくつかの変数は設定されていません... – mtrc

+1

あなたは美しいです。ちょっと、あなた。私はそれが働いたとは信じられません。 ProcessBuilderの$ PATHとMacの$ PATHの間に大きな違いがあります。 PBのパス変数を正しく設定すると、すぐに実行されました。私はプロジェクトを続けるのを待つことはできません。そんなにありがとう、ありがとう。 – mtrc

関連する問題