2016-11-24 17 views
-1

こんにちは私、このコマンドからJavaでの入力を取得しよう:「PSの補助|グレップのJava」私はこのコードを使用しますが、動作しませ :コンソールで取得コマンド入力

 Process process = Runtime.getRuntime().exec("ps aux | grep java"); 
    InputStream stdin = process.getInputStream(); 
    InputStreamReader isr = new InputStreamReader(stdin); 
    BufferedReader br = new BufferedReader(isr); 

    String line = null; 
    System.out.println("<OUTPUT>"); 

    while ((line = br.readLine()) != null) { 
     System.out.println(line); 
    } 

    System.out.println("</OUTPUT>"); 
    int exitVal = process.waitFor(); 
    System.out.println("Process exitValue: " + exitVal); 

出力: 処理exitValue:1 アイデア?

+0

サブプロセスの[標準エラー](http://docs.oracleを印刷してみてください。 com/javase/8/docs/api/java/lang/Process.html#getErrorStream--)何がうまくいかないかを確認します。 か 'のps --help ' '<すべて|リスト|出力|スレッド| | miscのシンプルな> PS --help' PS [オプション] てみてください。 エラー:ごみオプション 使い方 – DaoWen

+0

これは誤りであります追加のヘルプテキストについては、 をご覧ください。 詳細については、ps(1)を参照してください。 しかし、コンソールでこのコマンドを使用すると、良い出力が得られるのはなぜですか? – Larry

答えて

0

単一の文字列をRuntime.getRuntime().exec()に渡すと、1つのコマンドとその引数が自動的にトークン化されます。

ps 'aux' '|' 'grep' 'java' 

|は、grepは、とjavaはすべてpsに引数として渡されている方法を参照してください。他の言葉では、あなたのコードは、このコマンドを実行するのと同じですか?それが問題です。

私が代わりにProcessBuilderを使用して、そしてbash経由でコマンドを実行しているお勧め:

Process process = new ProcessBuilder().command("bash", "-c", "ps aux | grep java").start() 

これは、次のコマンドと同じです。

bash -c 'ps aux | grep java' 

bashサブプロセスはpsgrepとの間の配管を処理しますしたがって、すべて正常に動作するはずです。

Runtime.getRuntime().exec()でも同じことができますが、ProcessBuilderはより新しい、よりきれいなインターフェースなので、おそらく新しいコードに適しているはずです。 (それはJDK1.0以降の周りにいるexec()方法対、JDK1.5で追加されたためProcessBuilderが、実際には比較的新しいです。)

+0

Thx for help :) – Larry

関連する問題