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

我正在用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})只需两行即可编译代码。




牛魔王的故事
浏览 330回答 3
3回答

子衿沉夜

我相信,如果导入io和os与替换此://fmt.Println(out)有了这个:go&nbsp;io.Copy(os.Stdout,&nbsp;out)(见文档的io.Copy和为os.Stdout),它会做你想要什么。(免责声明:未经测试。)顺便说一句,您可能还想通过使用与标准输出相同的方法来捕获标准错误,但是要使用cmd.StderrPipe和os.Stderr。

慕标5832272

对于那些不需要循环使用但希望命令输出回显到终端而又不会cmd.Wait()阻塞其他语句的用户:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "io"&nbsp; &nbsp; "log"&nbsp; &nbsp; "os"&nbsp; &nbsp; "os/exec")func checkError(err error) {&nbsp; &nbsp; if err != nil {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatalf("Error: %s", err)&nbsp; &nbsp; }}func main() {&nbsp; &nbsp; // Replace `ls` (and its arguments) with something more interesting&nbsp; &nbsp; cmd := exec.Command("ls", "-l")&nbsp; &nbsp; // Create stdout, stderr streams of type io.Reader&nbsp; &nbsp; stdout, err := cmd.StdoutPipe()&nbsp; &nbsp; checkError(err)&nbsp; &nbsp; stderr, err := cmd.StderrPipe()&nbsp; &nbsp; checkError(err)&nbsp; &nbsp; // Start command&nbsp; &nbsp; err = cmd.Start()&nbsp; &nbsp; checkError(err)&nbsp; &nbsp; // Don't let main() exit before our command has finished running&nbsp; &nbsp; defer cmd.Wait()&nbsp; // Doesn't block&nbsp; &nbsp; // Non-blockingly echo command output to terminal&nbsp; &nbsp; go io.Copy(os.Stdout, stdout)&nbsp; &nbsp; go io.Copy(os.Stderr, stderr)&nbsp; &nbsp; // I love Go's trivial concurrency :-D&nbsp; &nbsp; fmt.Printf("Do other stuff here! No need to wait.\n\n")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go