如何使用javas Process.waitFor()?

时间:2011-05-30 14:46:44

标签: java shellexecute java-io

我正在尝试从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());
    }
}

3 个答案:

答案 0 :(得分:2)

你应该试试这个:

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

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

请告诉我这是否适合您。

答案 1 :(得分:2)

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

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

如果需要读取流的内容,则需要生成一个新线程,该线程将负责在子进程终止之前根据需要读取输入流和写入输出流的必要活动

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

关于SO的相关问题:

  1. Process.waitFor(), threads, and InputStreams

答案 2 :(得分:0)

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

如Femi的回答所示,你可以调用bash作为可执行文件,然后传递给bash执行sleep和echo命令的参数。