使用运行时获取命令输入 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'

看看 |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 实际上只是相对 新的,因为它是在 JDK1.5 中添加的,而 exec() 方法自 JDK1.0 以来就存在。)