【问题标题】:unix command line program does not exit after closing stdin [duplicate]关闭stdin后unix命令行程序不退出[重复]
【发布时间】:2017-04-05 22:02:36
【问题描述】:

我在 Java 中创建了一个 Process 对象(如果这很重要,该程序是 html 整洁的),通过标准输入 (Process.getOutputStream()) 为其提供一些数据,然后关闭流,但是当我调用 Process.waitFor() 时它永远不会返回,因为进程没有退出。如何在不调用 Process.destroy() 的情况下解决此问题?

【问题讨论】:

  • 不,我只是在其他地方找不到这个答案,并认为其他人可能会从我学到的东西中受益。
  • 你们为什么反对这个?我需要重新表述我的问题吗?
  • 你真的需要相同答案的 Unix 版本吗?
  • 我认为如果我只是说“关闭标准输入后程序不退出”会让人困惑,因为许多程序甚至不读取它,但大多数 Unix 实用程序都可以。
  • 现在我看到了您的重复问题标签,我明白了您的意思。不过,我将把它留在这里,以便其他人可以通过我使用的搜索词找到答案。

标签: java process


【解决方案1】:

tidy 可能正在等待您在输出退出之前使用它。如果您只是为程序提供了大量数据并且它正在为您返回大量数据,则很可能会出现这种情况。解决方案是在等待程序退出之前消耗输出。这就是我的处理方式(不是完整的代码):

    ProcessBuilder builder = new ProcessBuilder();
    //-*snip*-
    Process p = null;
    Throwable error = null;
    int returnCode = -1;
    String output = null;
    StringBuilder stdErr = new StringBuilder(200);
    try{
        p = builder.start();
        try (Writer w = new BufferedWriter(new OutputStreamWriter(p.
                getOutputStream()))){
            w.write(html);
        }
        Process reference = p;
        //read both outputs so tidy has no reason to wait
        Thread errReader = new Thread(()->{
            StringBuilderWriter writer = new StringBuilderWriter(stdErr);
            try {
                IOUtils.copy(reference.getErrorStream(), writer,
                        Charsets.UTF_8);
            }
            catch (IOException ex) {
                //nom...
                //An IOE that happens here will likely happen when reading
                //stdout as well.
            }
        });
        errReader.start();
        //tidy might be waiting for us to consume output
        output = IOUtils.toString(p.getInputStream());
        returnCode = p.waitFor();
        errReader.join();
    }

【讨论】:

  • 由于您想保留问题以供他人查找,作为重复问题的垫脚石,您可以通过删除答案来清除它给您的负面代表来恢复一些代表。
  • 我可以,但答案可能对某人有用,而且代表不多。我宁愿帮助别人也不愿拥有丰富的名声。
猜你喜欢
  • 2020-02-06
  • 2011-11-11
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 2013-09-05
  • 2018-02-22
  • 2012-09-23
  • 2015-08-02
相关资源
最近更新 更多