2017-11-30 5 views
-1

私はWindows7のcygwinで次のコードを実行していますが、出力が得られません。誰かが助けてくれますか? そして私は "netstat -a | grep ESTABLISHED"をLinuxのボックスでランタイムexec()を呼び出して使用し、他のすべての状態を取得しましたが、ESTABLISHED状態のみが必要です。 (誰かがこれを助けることができる?)grepのnetstatがJavaで失敗しています

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 

public class TestNetStat { 
public static void main(String[] args) { 
    try { 
     Process p = Runtime.getRuntime().exec("netstat -anl | grep 'LISTEN \\| ESTABLISHED \\| SYN_SENT \\| SYN_RECV \\| LAST_ACK \\| LAST_ACK \\| CLOSE_WAIT \\| TIME_WAIT \\| CLOSED \\| CLOSING \\| FIN_WAIT1 \\| FIN_WAIT2' | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'"); 
     BufferedReader in = new BufferedReader(
       new InputStreamReader(p.getInputStream())); 
     String line = null; 
     while ((line = in.readLine()) != null) { 
      System.out.println(line); 
     } 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

}

+2

デバッガが、プログラムが期待通りに動作していないことを示す最初の点は何ですか?何が起こったのでしょうか?そして、代わりに何が起こったのでしょうか? –

+0

'Process'のドキュメントを見ましたか? 'getInputStream'はstdinを返します。代わりに 'getOutputStream'を使ってみてください。ドキュメント:https://docs.oracle.com/javase/8/docs/api/java/lang/Process.html – lucasvw

+1

Javaプログラムなしでコマンドを実行したときに、コマンドが何かを戻しているかどうかを最初に確認してください – muasif80

答えて

0

残してメインスレッドのブロッキングがないように、私は、入力ストリームとも別のスレッドでエラーストリームを読み取ることになりますプログラムをぶら下げた状態にする。

​​

そして、あなたはこのコードを使用することができ、それを使用するには:もちろん

public static void main(String[] args) { 
    try { 
//   Process p = Runtime.getRuntime().exec("netstat -anl | grep 'LISTEN \\| ESTABLISHED \\| SYN_SENT \\| SYN_RECV \\| LAST_ACK \\| LAST_ACK \\| CLOSE_WAIT \\| TIME_WAIT \\| CLOSED \\| CLOSING \\| FIN_WAIT1 \\| FIN_WAIT2' | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'"); 
     Process p = Runtime.getRuntime().exec("cmd.exe /k netstat"); 
     Thread in = readFromStream(p.getInputStream(), System.out, "in"); 
     Thread err = readFromStream(p.getErrorStream(), System.err, "err"); 
     in.join(1000); 
     err.join(1000); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

あなたは意志を

まず私はストリームを作成し、スレッドを開始し、読み込むメソッドを作成することをお勧めあなたのコマンドでRuntime.getRuntime().exec()に実行されたコマンドを置き換える必要があります。

ところで-lフラグが存在しないようです。netstatです。

関連する問題