Reputation: 9425
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
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