使用运行时java获取命令输入

时间:2016-11-24 16:00:04

标签: java process runtime

你好我试着从这个命令获取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 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

当您将单个字符串传递给Runtime.getRuntime().exec()时,它需要一个命令及其参数,这些命令会自动标记化。换句话说,您的代码等同于执行此命令:

ps 'aux' '|' 'grep' 'java'

了解|grepjava如何作为ps的参数传递?这就是问题所在。

我建议改用ProcessBuilder,然后通过bash运行命令:

Process process = new ProcessBuilder().command("bash", "-c", "ps aux | grep java").start()

这相当于以下命令:

bash -c 'ps aux | grep java'

现在bash子流程处理psgrep之间的管道,所以它应该都能正常工作。

您可以使用Runtime.getRuntime().exec()执行相同的操作,但ProcessBuilder是一个更新,更清晰的界面,因此应该首选新代码。 (ProcessBuilder实际上只是相对 new,因为它是在JDK1.5中添加的,而不是自JDK1.0以来的exec()方法。)