1. ホーム
  2. go

[解決済み] Go で子プロセスの標準出力パイプをリダイレクトする

2022-10-12 18:04:36

質問

Goでプログラムを書いていて、サーバーのようなプログラム(これもGo)を実行するようにしています。子プログラムの標準出力が、親プログラムを起動したターミナルウィンドウに表示されるようにしたいのですが、どうすればよいでしょうか。これを実現するひとつの方法として cmd.Output() 関数を使うことですが、これはプロセスが終了した後にしか標準出力を表示しません。(このサーバーのようなプログラムは長い時間実行されるので、ログ出力を読みたいので問題です)

変数 outtype io.ReadCloser であり、私のタスクを達成するためにそれをどうすればよいのかわかりませんし、このトピックについてウェブ上で役に立つものを見つけることができません。

func main() {
    cmd := exec.Command("/path/to/my/child/program")
    out, err := cmd.StdoutPipe()
    if err != nil {
        fmt.Println(err)
    }
    err = cmd.Start()
    if err != nil {
        fmt.Println(err)
    }
    //fmt.Println(out)
    cmd.Wait()
} 

コードの説明 Println 関数を使用すると、コードがコンパイルできるようになることは知っています。 Println(out io.ReadCloser) は意味のある関数ではありません。

(を出力します)。 &{3 |0 <nil> 0} ) この2行は、コードをコンパイルするために必要なだけです。

どのように解決するのですか?

子プログラムの標準出力が、親プログラムを起動したターミナル ウィンドウに表示させたいです。

パイプやゴルーチンをいじる必要はありません、これは簡単です。

func main() {
    // Replace `ls` (and its arguments) with something more interesting
    cmd := exec.Command("ls", "-l")
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    cmd.Run()
}