【问题标题】:Defunct processes when java start terminal executionjava启动终端执行时的无效进程
【发布时间】:2016-07-15 10:36:21
【问题描述】:

我尝试使用kraken 对一些图像进行 ocr。我为此准备了一个控制台命令。 它很慢,所以我将它与 gnu 并行结合起来。

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 和执行),更少的线程),但没有任何帮助。

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

【问题讨论】:

    标签: java linux eclipse defunct


    【解决方案1】:

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

    试试:

    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)。

    【讨论】:

    • 跳过导致错误(无效搜索),但重定向输出到 dev/null 工作正常
    猜你喜欢
    • 2015-12-17
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多