你好我试着从这个命令获取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);
在控制台中输出: 处理exitValue:1 有什么想法吗?
答案 0 :(得分:0)
当您将单个字符串传递给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
实际上只是相对 new,因为它是在JDK1.5中添加的,而不是自JDK1.0以来的exec()
方法。)