[英]Execute shell script multiple commands in one line using Process Builder in Java (Unix)
[英]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.