ホームページ >バックエンド開発 >Golang >実行の完了を待たずにコマンド出力をリアルタイムでストリーミングするにはどうすればよいですか?

実行の完了を待たずにコマンド出力をリアルタイムでストリーミングするにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-17 21:00:03401ブラウズ

How to Stream Command Output in Real-time Instead of Waiting for Execution Completion?

コマンドの実行とその出力のストリーミング

問題: 出力表示の遅延

現在、コードはコマンドを処理し、実行が完了した場合にのみ出力が表示されます。プロセスが完了するのを待つのではなく、出力をライブでストリーミングするソリューションを探しています。

解決策: コマンド出力ストリーミング

ストリーム コマンドに次のアプローチを採用します。出力:

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() は、コマンドによって書き込まれた出力を提供するパイプを作成します。
  • scanner := bufio.NewScanner(stdout) は、 Pipe.
  • scanner.Split(bufio.ScanRunes) は、スキャナーが出力の各文字 (ルーン) を読み取り、処理することを保証します。
  • for ループは、継続的に stdout パイプから文字を読み取り、それらを出力します。
  • コマンドの実行が完了すると、cmd.Wait() はその成功または失敗を確認し、ログに記録します。結果。

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

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