質問
JSPスクリプトには、ランタイムクラスのexecメソッドを呼び出すexecute(string cmd)があります。
サーバーに保存されているPHPスクリプトのように、ローカルコマンドを呼び出すときに機能します。例:/usr/bin/php/path/to/php/script arg1 arg2
ですから、私の実行コマンドはそれで作業しているので、私の実行コマンドは大丈夫だと思います。
テキストベースのWebブラウザであるLynxを呼び出そうとすると、機能しません。
端末でそれを呼ぶ場合、それは正常に動作します:/usr/bin/lynx -dump -accept_all_cookies 'http://www.someurl.net/?arg1=1&arg2=2'
しかし、私が自分のexecuteコマンドからこれを呼ぶとき、何も起こりません...
理由は何ですか?
これは私の実行方法です:
public String execute(String cmd){
Runtime r = Runtime.getRuntime();
Process p = null;
String res = "";
try {
p = r.exec(cmd);
InputStreamReader isr = new InputStreamReader(p.getInputStream());
BufferedReader br = new BufferedReader(isr);
String line = null;
//out.println(res);
while ((line = br.readLine()) != null) {
res += line;
}
p.waitFor();
} catch (Exception e) {
res += e;
}
System.out.println(p.exitValue());
return res;
}
解決 2
私はそれを解決しました.... lynxをJSPスクリプトから呼び出したPHPスクリプトにlynxを呼び出すことによって...
それはくだらない解決策ですが、少なくともうまくいきます...私はまだJavaの幹部コマンドがそのように機能する理由を本当に理解していません...
とにかくあなたの助けに感謝しますandrzej(チェコ私は名前から..? ^_ ^)、どういうわけかあなたは私を途中に置いてください!
他のヒント
から読む必要があります Process
'出力ストリーム。
そうでないので、根底にあるリンクスプロセスは、出力の書き込み中にブロックされている可能性があり、誰かが出力ストリームのバッファを空にするのを待っています。 出力を無視する場合でも、とにかくそれを読む必要があります。.
として プロセスのJavadocs 「一部のネイティブプラットフォームは、標準の入力ストリームと出力ストリームに限られたバッファサイズのみを提供するため、入力ストリームを迅速に書き込んだり、サブプロセスの出力ストリームを読み取ったりしないと、サブプロセスがブロックされたり、デッドロックさえしたりする可能性があります。」
見る http://www.javaworld.com/javaworld/jw-12000/jw-1229-traps.html これを処理する方法のいくつかの例について。
編集:不思議に思う場合は、PHPスクリプトを呼び出したときに、大量の出力を生成しなかったため、出力バッファーとブロッキングを入力する前に終了することができた可能性があります。 Lynxコマンドは、おそらくより多くの出力を生成しているため、この問題に触れています。