Heim > Java > javaLernprogramm > Wie führt man Bash-Befehle zuverlässig aus und erfasst deren Ausgabe in Java?

Wie führt man Bash-Befehle zuverlässig aus und erfasst deren Ausgabe in Java?

Susan Sarandon
Freigeben: 2024-12-19 11:19:14
Original
672 Leute haben es durchsucht

How to Reliably Execute Bash Commands and Capture Their Output in Java?

Ausführen von Befehlen mit Eingabe-/Ausgabeströmen in Java

Problemübersicht

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“.

Lösung

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();
Nach dem Login kopieren

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;
    }
}
Nach dem Login kopieren

Einschränkungen

  • Die Lösung ist begrenzt Verarbeitung von Befehlen, die auf Benutzereingaben warten oder Ausgaben ohne Zeilenumbrüche generieren.
  • Es wird davon ausgegangen, dass der Befehl ein --EOF-- ausgibt. Zeile.
  • Die Verwendung von Klammern im geschriebenen Befehl kann zu Syntaxfehlern in Bash führen.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage