如何检测 Java 进程退出



在Java程序中,我正在生成一个sh脚本供在centOS机器上使用,该脚本将使用sox和lame来解码MP3音频文件,然后分别对文件应用一些增益。我在让 Process.waitFor() 方法做任何事情而不是无限期挂起时遇到了一些问题。这是代码:

            try
    {
    // TODO code application logic here
        String reviewPath = "/SomeDirectory/";
        String fileName = "FileName";
        String extension = ".mp3";
        StringBuilder sb = new StringBuilder();
        sb.append("#!/bin/bashn");
        sb.append("cd " + reviewPath + "n");
        sb.append("lame --decode " + fileName + extension + "n"); 
        File script = new File(reviewPath + fileName + ".sh");
        script.createNewFile();
        script.setExecutable(true);
        FileWriter writer = new FileWriter(script);
        writer.write(sb.toString());
        writer.close();
        Process p = Runtime.getRuntime().exec(script.getAbsolutePath());
        String line;
        BufferedReader bri = new BufferedReader
            (new InputStreamReader(p.getInputStream()));
        BufferedReader bre = new BufferedReader
            (new InputStreamReader(p.getErrorStream()));
        while ((line = bri.readLine()) != null) {
            System.out.println(line);
        }
        bri.close();
        while ((line = bre.readLine()) != null) {
            System.out.println(line);
        }
        bre.close();
        p.waitFor();
        System.out.println("Done.");
    }
    catch (Exception e)
    {
        System.out.println(e.getMessage());
    }

奇怪的是,当我运行它手动生成的.sh文件时,它会很好地运行和退出,但是当我从 java 中的进程对象执行它时,它永远不会退出。进程的退出值始终为"进程尚未退出"。我尝试将 set -e 添加到脚本中,然后退出到脚本末尾。除了使用 kill 命令(我真的认为我不能在这里做)之外,我对这里发生的事情不知所措。有什么建议吗?

在开始该过程后添加类似while(p.getInputStream().read() != -1);的内容。缓冲区将被填满,进程将停止等待某些内容(在本例中为程序)从中读取以释放空间。

我想通了!这里的问题确实是需要刷新输出流才能退出应用程序,但仅仅从流中读取是不够的。我使用了 Suresh Koya 的建议并使用了 processBuilder api,并在启动进程之前重定向了进程上的错误流,并从流中读取。这解决了我遇到的问题:D

相关内容

  • 没有找到相关文章

最新更新