你好,我尝试从此命令中获取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
实际上只是相对 new,因为它是在JDK1.5中添加的,而exec()
自JDK1.0以来就存在。)