ホームページ >バックエンド開発 >Golang >Go でコマンド出力をストリーミングしてライブ結果を得るにはどうすればよいですか?

Go でコマンド出力をストリーミングしてライブ結果を得るにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-20 13:32:17434ブラウズ

How to Stream Command Output in Go for Live Results?

ライブ結果のコマンド出力のストリーミング

Go でコマンドを実行すると、外部プロセスと対話できますが、リアルタイムでの出力が必要な場合は、次の方法があります。

コード スニペットでは、コマンドの完了後に出力が一度に出力されます。出力をライブで表示するには、以下で概説する手法を組み込むことができます。

// ... Previous code

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

// ... Remaining code

説明

この変更では、bufio.Scanner を使用してコマンドの標準出力をリアルタイムで読み取ります。 Split(bufio.ScanRunes) は、スキャナーに個々の文字を読み取るように指示します。これにより、生成中の出力を表示できるようになります。

scanner.Scan() を繰り返し呼び出し、scanner.Text() を出力することによって、出力の終わりに達すると、コマンドの出力を画面上にライブでストリーミングできます。

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

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