使用运行时获取命令输入 java
Getting command Input with runtime java
您好,我尝试通过此命令在 java 中获取输入:"ps aux | grep 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);
控制台输出:
进程退出值:1
有什么想法吗?
当您将单个字符串传递给 Runtime.getRuntime().exec()
时,它需要一个命令及其参数,它们会自动标记化。也就是说,你的代码相当于执行这条命令:
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
子进程处理 ps
和 grep
之间的管道,所以它应该可以正常工作。
您可以使用 Runtime.getRuntime().exec()
做同样的事情,但是 ProcessBuilder
是一个更新、更清晰的界面,因此应该更适合新代码。 (ProcessBuilder
实际上只是相对 新的,因为它是在 JDK1.5 中添加的,而 exec()
方法自 JDK1.0 以来就存在。)
您好,我尝试通过此命令在 java 中获取输入:"ps aux | grep 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);
控制台输出: 进程退出值:1 有什么想法吗?
当您将单个字符串传递给 Runtime.getRuntime().exec()
时,它需要一个命令及其参数,它们会自动标记化。也就是说,你的代码相当于执行这条命令:
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
子进程处理 ps
和 grep
之间的管道,所以它应该可以正常工作。
您可以使用 Runtime.getRuntime().exec()
做同样的事情,但是 ProcessBuilder
是一个更新、更清晰的界面,因此应该更适合新代码。 (ProcessBuilder
实际上只是相对 新的,因为它是在 JDK1.5 中添加的,而 exec()
方法自 JDK1.0 以来就存在。)