一尘不染

在Go中重定向子进程的stdout管道

go

我正在用Go编写程序,该程序执行类似程序的服务器(也就是Go)。现在,我想在启动父程序的终端窗口中获​​得子程序的标准输出。一种方法是使用cmd.Output()函数,但这仅在进程退出后才输出标准输出。(这是一个问题,因为这个类似于服务器的程序运行了很长时间,并且我想读取日志输出)

变量out是,type 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})只需两行即可编译代码。


阅读 280

收藏
2020-07-02

共1个答案

一尘不染

现在,我想在启动父程序的终端窗口中获​​得子程序的标准输出。

无需弄乱管道或goroutine,这很容易。

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()
}
2020-07-02