Heim  >  Artikel  >  Backend-Entwicklung  >  Wie streame ich die Befehlsausgabe in Echtzeit mit Go?

Wie streame ich die Befehlsausgabe in Echtzeit mit Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-22 00:04:17901Durchsuche

How to Stream Command Output in Real-Time Using Go?

Befehlsausgabe online streamen

Betrachten Sie den folgenden Code, der einen Befehl ausführt und seine Ausgabe erfasst:

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]
    // Wait to finish, get output:
    out, err := cmd.Output()
    if err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Println("Finished %s, output: %s", cp[1:], out)
}

Dieser Code erfasst die vollständige Ausgabe des Befehls und gibt sie erst aus, nachdem die Ausführung des Befehls abgeschlossen ist. Es besteht jedoch die Notwendigkeit, die Ausgabe in Echtzeit zu streamen.

Um ein Live-Ausgabe-Streaming zu erreichen, können wir den Code wie folgt ändern:

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:])
}

Hier finden Sie eine Erklärung der Änderungen :

  • cmd.StdoutPipe() erstellt eine Pipe zum Lesen des Befehlsstandards Ausgabe.
  • cmd.Start() startet den Befehl im Hintergrund.
  • bufio.NewScanner(stdout) erstellt einen Scanner zum Lesen aus der stdout-Pipe.
  • scanner. Split(bufio.ScanRunes) stellt den Scanner so ein, dass er nach Runen liest und Live-Streaming ermöglicht.
  • Die Scan()-Schleife des Scanners kontinuierlich liest und druckt jede vom Befehl erzeugte Rune (Zeichen).
  • Nachdem die Schleife beendet ist (das Schreiben des Befehls in stdout ist abgeschlossen), prüft scanner.Err() auf etwaige Fehler.
  • cmd .Wait() wartet auf den Abschluss des Befehls und prüft auf Fehler.
  • Die letzte log.Println()-Anweisung protokolliert die Befehle Fertigstellung.

Das obige ist der detaillierte Inhalt vonWie streame ich die Befehlsausgabe in Echtzeit mit 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