Heim  >  Artikel  >  Backend-Entwicklung  >  Wie streame ich die Live-Ausgabe ausgeführter Befehle in Go?

Wie streame ich die Live-Ausgabe ausgeführter Befehle in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-24 05:48:09729Durchsuche

How to Stream Live Output from Executed Commands in Go?

Live-Ausgabe ausgeführter Befehle

Dieser Codeausschnitt zeigt ein Problem, das häufig beim Ausführen von Befehlen und beim Abrufen ihrer Ausgabe in Go auftritt: Die Ausgabe wird Erst verfügbar, nachdem die Ausführung des Befehls abgeschlossen ist. Um dieses Problem zu beheben, wird eine modifizierte Lösung bereitgestellt, die ein Live-Streaming der Befehlsausgabe ermöglicht.

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}

for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}

Erklärung:

  • cmd.StdoutPipe() Erstellt eine Pipe, die es uns ermöglicht, die Standardausgabe des Befehls in Echtzeit zu lesen.
  • bufio.NewScanner(stdout) Erstellt einen Scanner, der Runen (Zeichen) aus der Ausgabepipe liest.
  • scanner.Scan() liest und druckt jedes Zeichen, sobald es verfügbar wird.
  • Die Schleife liest und druckt weiterhin Zeichen bis Der Befehl wird beendet oder es tritt ein Fehler auf.
  • Nachdem der Befehl beendet ist, wird die verbleibende Ausgabe gedruckt und der Exit-Status des Befehls lautet abgerufen.

Zusätzliche Hinweise:

  • Diese Lösung streamt nur die Standardausgabe. Standardfehler können auch mit Command.StderrPipe() gestreamt werden.
  • Einige Befehle schreiben möglicherweise nicht alles in ihre Standardausgabe oder ihren Fehler. In solchen Fällen wird die Ausgabe möglicherweise nicht korrekt gestreamt.

Das obige ist der detaillierte Inhalt vonWie streame ich die Live-Ausgabe ausgeführter Befehle in Go?. 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