简体   繁体   English

如何使用 Java 中的进程 object 在 shell 中执行命令

[英]How to execute commands inside a shell using Process object in Java

I executed a shell using:我使用以下命令执行了 shell:

Process process = Runtime.getRuntime().exec("docker exec rabbitmq bash");

But now, I want to execute another command inside the opened shell:但是现在,我想在打开的 shell 中执行另一个命令:

Writer w = new OutputStreamWriter(process.getOutputStream(), "UTF-8");
w.write("rabbitmqctl list_queues\n");
w.flush();

But I can't get the output of rabbitmqctl list_queues但是我无法得到 rabbitmqctl list_queues 的rabbitmqctl list_queues

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

I don't get any errors, if I use a malformed command, it will issue an error message:我没有收到任何错误,如果我使用格式错误的命令,它将发出错误消息:

BufferedReader error = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String errorString = error.readLine();
System.out.println("\nError : " + errorString);

int exitCode = process.waitFor();

The problem was the lack of use of -i parameter:问题是缺少使用-i参数:

Process process = Runtime.getRuntime().exec("docker exec -i rabbitmq bash");

But, using only Process class I had had problems, the interpreter didn't understand the end of output and the loop didn't stop:但是,仅使用 Process class 我遇到了问题,解释器不理解 output 的结尾并且循环没有停止:

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}

But using ProcessBuilder it worked:但是使用 ProcessBuilder 它起作用了:

    @Test
    void test_process_builder() throws IOException {
        ProcessBuilder builder = new ProcessBuilder("docker","exec","-i","rabbitmq3","bash");
        Process process = builder.start();

        OutputStream stdin = process.getOutputStream(); // <- Eh?
        InputStream stdout = process.getInputStream();
        InputStream stderr = process.getErrorStream();

        BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(stdin));
        BufferedReader error = new BufferedReader(new InputStreamReader(stderr));

        writer.write("rabbitmqctl list_queues \n");
        writer.flush();
        writer.close();

        Scanner err = new Scanner(stderr);
        while (err.hasNextLine()) {
            System.out.println(err.nextLine());
        }
        
        Scanner scanner = new Scanner(stdout);
        while (scanner.hasNextLine()) {
            System.out.println(scanner.nextLine());
        }
    }

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

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