0

Runtime クラスから exec メソッドを呼び出す jsp スクリプトに 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 '

しかし、実行コマンドからこれを呼び出すと、何も起こりません...

理由はありますか?

これは私の実行方法です:

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;

    }
4

2 に答える 2

1

Process'出力ストリームから読み取る必要があります。

そうではないので、基になるlynxプロセスは、出力の書き込み中にブロックし、誰かが出力ストリームのバッファーを空にするのを待っている可能性があります。 出力を無視する場合でも、プロセスを期待どおりに実行するには、出力を読み取る必要があります

Processのjavadocsが言うように、「一部のネイティブプラットフォームは、標準の入力ストリームと出力ストリームに制限されたバッファサイズしか提供しないため、サブプロセスの入力ストリームの書き込みまたは出力ストリームの読み取りに失敗すると、サブプロセスがブロックされ、デッドロックが発生する可能性があります。 「」

これを処理する方法のいくつかの例については、http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.htmlを参照してください。

編集:不思議に思うかもしれませんが、PHPスクリプトを呼び出したときに大量の出力が生成されなかったため、出力バッファーをいっぱいにしてブロックする前に終了できた可能性があります。lynxコマンドはおそらくより多くの出力を生成しているため、この問題が発生します。

于 2010-05-18T11:33:05.367 に答える
0

私はそれを解決しました.... lynxをphpスクリプト、Jspスクリプトから呼び出したphpスクリプトに呼び出すことで...

それはくだらない解決策ですが、少なくとも機能します...なぜJavaからのexecコマンドがそのように機能するのか、まだよくわかりません...

とにかく助けてくれてありがとう Andrzej (名前から推測するとチェコ語..? ^_^)、どういうわけかあなたは私を途中で置きました!

于 2010-05-18T13:17:23.640 に答える