Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man die Standardausführung der Befehlsausführung in Echtzeit erfassen?

Wie kann man die Standardausführung der Befehlsausführung in Echtzeit erfassen?

Linda Hamilton
Linda HamiltonOriginal
2024-11-02 07:44:29485Durchsuche

How to Capture Command Execution stdout in Real Time?

Erfassen der Standardausführung der Befehlsausführung in Echtzeit

In einem Chatbot, der Befehle ausführt, müssen wir häufig die Standardausgabe der darin enthaltenen Skripte anzeigen die Chat-Oberfläche. Während die aktuelle Implementierung die gesamte Standardausgabe auf einmal sammelt und zurückgibt, suchen wir nach einer Lösung, die die Ausgabe in Echtzeit bereitstellt.

Die Überprüfung des angegebenen Codes zeigt eine Einschränkung, bei der die Standardausgabe in einem einzigen Funktionsaufruf abgerufen und zurückgegeben wird (Neustart()). Um Text in Echtzeit auszugeben, müssen wir den Ausführungsbefehl durchlaufen und die Standardausgabe kontinuierlich erfassen.

Der Schlüssel zu dieser Lösung ist die Verwendung der StdoutPipe-Methode, die es uns ermöglicht, eine Pipe zum Erfassen der Ausgabe von zu erstellen ein ausgeführter Befehl. Indem wir eine Pipe für die Standardausgabe des Befehls einrichten, können wir die Ausgabe kontinuierlich lesen und anzeigen.

Verbesserter Code:

<code class="go">package main

import (
    "os"
    "os/exec"
    "fmt"
    "bufio"
)

func main() {
    // Specify the command to execute
    cmd := exec.Command("command", "arguments")

    // Create a pipe for the output of the script
    cmdReader, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error creating StdoutPipe for Cmd", err)
        return
    }

    scanner := bufio.NewScanner(cmdReader)

    // Launch a goroutine to continuously read and display the output
    go func() {
        for scanner.Scan() {
            fmt.Printf("\t > %s\n", scanner.Text())
        }
    }()

    // Start the execution of the command
    err = cmd.Start()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error starting Cmd", err)
        return
    }

    // Wait for the command to complete
    err = cmd.Wait()
    if err != nil {
        fmt.Fprintln(os.Stderr, "Error waiting for Cmd", err)
        return
    }
}</code>

In dieser verbesserten Lösung lesen wir kontinuierlich die Ausgabe der Standardausgabe des Befehls innerhalb einer Goroutine, was eine Echtzeitanzeige der Standardausgabe in der Chat-Oberfläche ermöglicht. Dadurch entfällt die Notwendigkeit eines großen Puffers und die Rückgabe der gesamten Standardausgabe in einem einzigen Funktionsaufruf wird vermieden, wodurch das ursprüngliche Problem behoben wird.

Das obige ist der detaillierte Inhalt vonWie kann man die Standardausführung der Befehlsausführung in Echtzeit erfassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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