繁体   English   中英

java ProcessBuilder运行shell脚本是挂起的

[英]java ProcessBuilder run shell script is hanging

我正在尝试使用ProcessBuilder运行shell脚本。 该脚本可以工作但不能在java代码之后运行。 并且错误流不输出消息。 我在centOS 6.9计算机上运行它。 请在下面找到我的代码。

public static ArrayList<String> runCommand(ArrayList<String> command)throws IOException {

        ProcessBuilder processBuilder = new ProcessBuilder();
        processBuilder.command(command);
        Process process = processBuilder.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));

        ArrayList<String> commandOutput = new ArrayList<>();
        String str;
        while((str = reader.readLine()) != null) {
            commandOutput.add(str);
        }

        StringBuilder errorBuilder = new StringBuilder();
        while((str = errorReader.readLine()) != null) {
            errorBuilder.append(str);
        }

        String errorMessage = errorBuilder.toString();
        if(!errorMessage.equals("")) {
            String message = LOG_TAG + ",[runCommand] error:" + errorMessage;
            System.out.println(message);
        }

        reader.close();
        errorReader.close();
        process.destroy();

        return commandOutput;
    }

在您的情况下,您正在从流程的输出流中读取内容,直到您使用所有内容。 然后,您尝试读取错误流。

如果进程在错误流上写入了相当多的字符,则另一个进程将阻塞直到它们被占用。 要同时使用错误流和输出流,您需要使用线程。

您可以遵循StreamGobbler技术。 您可以从该页面获得一些详细信息: https//www.javaworld.com/article/2071275/when-runtime-exec---won-t.html? page = 2

这是一些受页面影响的代码:

public class StreamGobbler extends Thread {
    private static final String EOL = System.lineSeparator();
    private final InputStream inputStream;
    private final StringBuilder output = new StringBuilder();

    public StreamGobbler(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public void run() {
        try (InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
             BufferedReader reader = new BufferedReader(inputStreamReader);
        ) {
            String line;
            while ((line = reader.readLine()) != null) {
                output.append(line);
                output.append(EOL);
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    public String getOutput() {
        return output.toString();
    }
}

在您的代码中,您使用StreamGobbler如下所示:

    StreamGobbler outputGobbler = new StreamGobbler(process.getInputStream());
    StreamGobbler errorGobbler = new StreamGobbler(process.getErrorStream());

    process.waitFor();

    String commandOutput = outputGobbler.getOutput();
    String errorMessage = errorGobbler.getOutput();
    process.destroy();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM