danilo
danilo

Reputation: 9425

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

I executed a shell using:

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

But now, I want to execute another command inside the opened 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

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();

Upvotes: 2

Views: 116

Answers (1)

danilo
danilo

Reputation: 9425

The problem was the lack of use of -i parameter:

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:

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

But using ProcessBuilder it worked:

    @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());
        }
    }

Upvotes: 1

Related Questions