ホームページ  >  記事  >  バックエンド開発  >  Go を使用してコマンド出力をリアルタイムでストリーミングするにはどうすればよいですか?

Go を使用してコマンド出力をリアルタイムでストリーミングするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-22 00:04:17885ブラウズ

How to Stream Command Output in Real-Time Using 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]
    // 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)
}

このコードはコマンドの完全な出力をキャプチャし、コマンドの実行が終了した後にのみ出力します。ただし、出力をリアルタイムでストリーミングする必要があります。

ライブ出力ストリーミングを実現するには、コードを次のように変更できます。

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() はコマンドの標準を読み取るためのパイプを作成しますOutput.
  • cmd.Start() はバックグラウンドでコマンドを開始します。
  • bufio.NewScanner(stdout) は、stdout パイプから読み取るためのスキャナーを作成します。
  • scanner。 Split(bufio.ScanRunes) はルーン文字で読み取るようにスキャナーを設定し、ライブを提供します
  • スキャナーの Scan() ループは、コマンドによって生成された各ルーン (文字) を継続的に読み取り、印刷します。
  • ループが終了した後 (コマンドの標準出力への書き込みが完了した後)、スキャナー。 Err() はエラーがないかチェックします。
  • cmd.Wait() はコマンドが終了するのを待ってエラーをチェックします。エラー。
  • 最後の log.Println() ステートメントは、コマンドの完了をログに記録します。

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

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