Sie möchten ein Java-Programm erstellen, das Befehle in einer Bash-Shell ausführt und sammelt ihre Ausgabe. Es treten jedoch Probleme mit mehreren Ausgabestreams auf, die nach dem ersten Lesevorgang nicht funktionieren, und der Ausnahme „Broken Pipe“.
1. ProcessBuilder verwenden:
Prozess ersetzen process = Runtime.getRuntime().exec("/bin/bash"); mit:
ProcessBuilder builder = new ProcessBuilder("/bin/bash"); builder.redirectErrorStream(true); Process process = builder.start();
ProcessBuilder ermöglicht die Umleitung des Standardfehlers in die Standardausgabe, sodass keine separaten Threads für stderr und stdout erforderlich sind.
2. Warten auf den Abschluss der Ausgabe:
Die Schleifen, die aus dem Ausgabestream (reader.readline()) lesen, werden blockiert, bis der Prozess beendet wird oder ein Dateiende sendet. Um Abstürze zu vermeiden, stellen Sie sicher, dass die Schleifen nur dann durchlaufen, wenn die erwartete Ausgabe empfangen wurde.
3. Verwenden Sie eine „magische Linie“, um das Ende der Ausgabe zu markieren:
Um zuverlässig zu bestimmen, wann die Ausgabe des ausgeführten Befehls abgeschlossen ist, sollten Sie erwägen, eine bestimmte Zeile zu schreiben (z. B. „--EOF--“). um das Ende der Ausgabe zu signalisieren. Diese im folgenden Codeausschnitt demonstrierte Technik hilft bei der Bewältigung von Szenarien, in denen der Prozess nicht mit einem Zeilenumbruch beendet wird:
while (scan.hasNext()) { String input = scan.nextLine(); if (input.trim().equals("exit")) { writer.write("exit\n"); } else { writer.write("((" + input + ") && echo --EOF--) || echo --EOF--\n"); } writer.flush(); line = reader.readLine(); while (line != null && ! line.trim().equals("--EOF--")) { System.out.println("Stdout: " + line); line = reader.readLine(); } if (line == null) { break; } }
Hinweis: Dieser Ansatz stellt sicher, dass alle Ausgaben des ausgeführten Befehls wird erfasst, bevor ein weiterer Befehl eingegeben wird. Es ermöglicht die kontinuierliche Ausführung von Befehlen in einer geplanten Thread-Aufgabe, ohne dass die Ausnahme „Broken Pipe“ auftritt.
Das obige ist der detaillierte Inhalt vonWie führt man Bash-Befehle zuverlässig aus und erfasst deren Ausgabe in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!