如何使用Java Process.waitFor()?

| 我试图从Java运行命令行命令,并且进行了快速的健全性检查,使我意识到我遇到麻烦的原因是我无法使下面的ѭ0调用起作用。该程序在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中运行您的命令。命令完成后,外壳程序才返回。 让我知道这是否适合您。     
        “ 3”阻塞当前线程,直到进程终止,此时执行控制返回到生成进程的线程。 在发布的代码中,一旦进程终止(即,在Process.waitFor调用之后),现在终止的进程的输入流将不再具有任何可读取的数据。因此,读取流的内容并将其打印出来不会导致任何有形的输入。 如果需要读取流的内容,则需要产生一个新线程,该线程将在子进程终止之前处理读取输入流和根据需要写入输出流的必要活动。 或者,您可以在同一线程中执行读取和写入操作,但要等待子进程终止。换句话说,您需要切换包含
pr.waitFor();
的行和从InputStream读取的行的顺序。 关于SO的相关问题: Process.waitFor(),线程和InputStreams     
        您正在尝试执行shell命令。您应该尝试执行程序。 如Femi的回答所示,您可以调用bash作为可执行文件,然后将bash执行sleep和echo命令的参数传递给它。     

要回复问题请先登录注册