繁体   English   中英

如何使用 javas Process.waitFor()?

[英]How to use javas Process.waitFor()?

我正在尝试从 Java 运行命令行命令,快速的健全性检查让我意识到我遇到问题的原因是我无法让下面的pr.waitFor()调用工作。 该程序在不到 30 秒后结束,并且在 "foo:" 之后不打印任何内容。 我预计它只需要 30 多秒并在“foo:”之后打印一个随机数。 我究竟做错了什么?

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Sample {

    public static void main(String[] args) throws Exception {
        Runtime rt = Runtime.getRuntime();
        Process pr = rt.exec("sleep 32; echo $RANDOM");
        pr.waitFor();

        BufferedReader input = new BufferedReader(
                                   new InputStreamReader(pr.getInputStream()));
        String line=null;

        StringBuilder s = new StringBuilder();
        while((line=input.readLine()) != null) {
            System.out.println(s);
            s.append(line);
        }
        System.out.println("foo: " + s.toString());
    }
}

你应该试试这个:

Process pr = rt.exec(new String[]{ "bash","-c", "sleep 32; echo $RANDOM" });

这将启动 shell 进程,然后在 shell 中运行您的命令。 shell 直到命令完成后才会返回。

让我知道这是否适合你。

Process.waitFor()阻塞当前线程,直到进程终止,此时执行控制返回到产生该进程的线程。

在发布的代码中,一旦进程终止(即在 Process.waitFor 调用之后),现在终止的进程的输入 stream 不再有任何可以读取的数据。 读取 stream 的内容并将其打印出来,因此不会产生任何有形的输入。

If you need to read the contents of the stream, you'll need to spawn a new thread that will take care of the necessary activities of reading the input stream and writing to the output stream as required, before the child process terminates.

或者您可以在同一个线程中执行读取和写入,但在等待子进程终止之前。 换句话说,您需要切换包含pr.waitFor(); 以及从 InputStream 读取的行。

关于 SO 的相关问题:

  1. Process.waitFor()、线程和 InputStreams

您正在尝试执行 shell 命令。 您应该尝试执行一个程序。

如 Femi 的回答所示,您可以调用 bash 作为可执行文件,然后将 arguments 传递给它,这将使 bash 执行 sleep 和 echo 命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM