ホームページ >バックエンド開発 >Golang >Go で実行されたコマンドからのライブ出力をストリーミングするにはどうすればよいですか?

Go で実行されたコマンドからのライブ出力をストリーミングするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-24 05:48:09813ブラウズ

How to Stream Live Output from Executed Commands in Go?

実行されたコマンドのライブ出力

このコード スニペットは、Go でコマンドを実行してその出力を取得するときによく発生する問題を示しています。出力は次のようになります。コマンドの実行が終了した後にのみ使用できます。これに対処するために、コマンドの出力のライブ ストリーミングを可能にする修正されたソリューションが提供されています。

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

説明:

  • cmd.StdoutPipe()コマンドの標準出力を読み取ることができるパイプを作成します。 real-time.
  • bufio.NewScanner(stdout) は、出力パイプからルーン文字 (文字) を読み取るスキャナーを作成します。
  • scanner.Scan() は、各文字を読み取って出力します。
  • ループは、コマンドが終了するかエラーが発生するまで、文字の読み取りと出力を継続します。
  • コマンドが終了すると、残りの出力が出力され、コマンドの終了ステータスが取得されます。

追加メモ:

  • このソリューションは標準出力のみをストリーミングします。標準エラーは、Command.StderrPipe() を使用してストリーミングすることもできます。
  • 一部のコマンドは、標準出力またはエラーにすべてを書き込めない場合があります。このような場合、出力は正しくストリーミングされない可能性があります。

以上がGo で実行されたコマンドからのライブ出力をストリーミングするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。