process.waitFor() 从不返回

2022-08-31 09:39:17
Process process = Runtime.getRuntime().exec("tasklist");
BufferedReader reader = 
    new BufferedReader(new InputStreamReader(process.getInputStream()));
process.waitFor();

答案 1

有很多原因没有返回。waitFor()

但它通常归结为执行的命令不会退出的事实。

同样,这可能有很多原因。

一个常见原因是该过程会产生一些输出,并且您没有从相应的流中读取。这意味着,一旦缓冲区已满,进程就会被阻止,并等待进程继续读取。您的进程依次等待另一个进程完成(它不会,因为它等待您的进程,...)。这是一种典型的僵局。

您需要不断从进程输入流中读取,以确保它不会阻塞。

有一篇很好的文章解释了所有陷阱,并展示了围绕它们的方法,称为“当运行时.exec()不会”(是的,这篇文章来自2000年,但内容仍然适用!Runtime.exec()


答案 2

在等待输出完成之前,您似乎没有读取输出。仅当输出未填充缓冲区时,这才没有问题。如果是这样,它将等到您读取输出 catch-22。

也许你有一些你没有阅读的错误。这将使应用程序停止并等待永远等待。解决此问题的一种简单方法是将错误重定向到常规输出。

ProcessBuilder pb = new ProcessBuilder("tasklist");
pb.redirectErrorStream(true);
Process process = pb.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null)
    System.out.println("tasklist: " + line);
process.waitFor();

推荐