簡體   English   中英

如何使用 Java 中的進程 object 在 shell 中執行命令

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

我使用以下命令執行了 shell:

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

但是現在,我想在打開的 shell 中執行另一個命令:

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

但是我無法得到 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);
}

我沒有收到任何錯誤,如果我使用格式錯誤的命令,它將發出錯誤消息:

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

int exitCode = process.waitFor();

問題是缺少使用-i參數:

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

但是,僅使用 Process class 我遇到了問題,解釋器不理解 output 的結尾並且循環沒有停止:

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

但是使用 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