netstat和grep在Java中失败了
我正在windows7上的cygwin中运行以下代码,但它没有给出输出,有人能帮我吗? 我在linux框中通过runtime exec()调用使用了“netstat-a | grep-builded”,并获得了所有其他状态,但我只需要已建立的状态。(有人能帮忙吗?)netstat和grep在Java中失败了,java,Java,我正在windows7上的cygwin中运行以下代码,但它没有给出输出,有人能帮我吗? 我在linux框中通过runtime exec()调用使用了“netstat-a | grep-builded”,并获得了所有其他状态,但我只需要已建立的状态。(有人能帮忙吗?) }我将在一个单独的线程中读取输入流和错误流,这样就不会阻塞主线程,从而使程序处于挂起状态 首先,我建议创建一个方法,用于创建和启动线程并读取流: private static Thread readFromStream(InputS
}我将在一个单独的线程中读取输入流和错误流,这样就不会阻塞主线程,从而使程序处于挂起状态 首先,我建议创建一个方法,用于创建和启动线程并读取流:
private static Thread readFromStream(InputStream stdin, PrintStream out, String name) throws IOException {
Thread thread = new Thread(() -> {
try (BufferedReader in = new BufferedReader(new InputStreamReader(stdin))) {
String line;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
}, name);
thread.setDaemon(true);
thread.start();
return thread;
}
要使用它,您可以使用以下代码:
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()
中执行的命令
顺便问一下:对于
netstat
,似乎不存在-l
标志。调试器向您显示的第一点是什么?该程序的行为与您预期的不一样?当时/那里应该发生什么,后来又发生了什么?你看过流程的文档了吗getInputStream
返回标准输入。尝试改用getOutputStream
。Docs:首先检查在没有java的情况下运行命令时是否返回某些内容program@lucasvw,Process::getInputStream
不返回stdin
-它返回链接到进程的stdout
的管道stdin
由@SairamVinjamuri返回,检查进程的错误流中是否有任何内容。
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();
}
}