java启动终端执行时失去进程

时间:2016-07-15 10:36:21

标签: java linux eclipse defunct

我尝试使用kraken查看一些图像。我准备了一个控制台命令来做到这一点。 它很慢,所以我将它与gnu parallel结合起来。

find temp/ -name '*.tif' -or -name '*.jpg' | parallel -j4 kraken -i {} {}.html binarize segment ocr -h

当我在终端中执行此操作时,它工作正常。当我在java(eclipse)中启动它时,执行在30个图像之后停止。它不会终止。它留下了已经不存在的流程。

String command = "find temp/ -name '*.tif' -or -name '*.jpg' | parallel -j4 kraken -i {} {}.html binarize segment ocr -h";
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c",command});
p.waitFor() == 0;

我尝试了几种配置(更多的内存(eclipse和exceution),更少的线程),但没有任何帮助。

是否有人想要避免失效的过程或如何重新开始执行?

1 个答案:

答案 0 :(得分:0)

几乎可以肯定,问题在于你没有消耗进程的输出,导致其输出缓冲区被填满,因此进程停止。

尝试:

String command = "find temp/ -name '*.tif' -or -name '*.jpg' | parallel -j4 kraken -i {} {}.html binarize segment ocr -h";
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c",command});
InputStream is = p.getInputStream();
// is.skip(Long.MAX_VALUE);  Doesn't work
while (is.read() != -1) { } // consume all process output
p.waitFor();

完整的解决方案也会处理错误流。这可以通过启动一个单独的线程来完成,该线程读取/跳过错误流的输入。

(或者,您可以在bash命令脚本中将输出重定向到/dev/null