如何在go中打印正在运行的子进程的实时输出?

coo*_*aac 5 go

我有以下 bash 脚本bash_loop.sh,它打印 1 到 10 并在中间睡眠 3 秒。

\n\n
#!/bin/bash\n# Basic while loop\ncounter=1\nwhile [ $counter -le 10 ]\ndo\n    echo $counter\n    ((counter++))\n   sleep 3 \ndone\necho All done\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,我的 go 代码如下:

\n\n
burstingScript := "bash_loop.sh"\ncmd := exec.Command("/bin/sh", burstingScript)\n\nvar out bytes.Buffer\ncmd.Stdout = &out\nif err := cmd.Run(); err != nil {\n    fmt.Println("An error has occurred..")\n    log.Fatal(err)\n}\nfmt.Println(out.String())\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,这只会打印出之后的所有内容,而不是在可用时打印内容。

\n\n

所以我的问题是,我是否可以打印每个数字打印每个数字,而不是在 bash 脚本完成执行后打印所有内容。

\n\n

PS1:在实际用例中,我必须实时处理 bash 脚本的输出,而不是简单地将内容打印到os.Stdout,所以我想知道是否有任何命令poll(),所以我想知道go 中

\n\n

PS2\xef\xbc\x9a在实际用例中,我想在发现有趣的消息后立即与子进程分离。例如,在读取 3 后,我希望函数立即返回 3,而不再等待其余输出,尽管我仍然希望子进程(bash 脚本)本身启动并运行。

\n\n

PS3:在Python中,我会做这样的事情

\n\n
cmd = "./bash_loop.sh"\np = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)\n\nresult = {}\nwhile True:\n    out = p.stdout.readline()\n    if out == \'\' and p.poll() != None:\n        break\n    if out != \'\':\n        #process(out)\n        sys.stdout.write(out)\n        sys.stdout.flush()\n
Run Code Online (Sandbox Code Playgroud)\n\n

PS4:现在我已经改进了我的 go 片段以供遵循。如果我在命令运行完毕之前返回,孩子会变成僵尸吗?

\n\n
burstingScript := path.Join(rootDir, "bash_loop.sh")\ncmd := exec.Command("/bin/sh", burstingScript)\n\nstdout, _ := cmd.StdoutPipe()\ncmd.Start()\nscanner := bufio.NewScanner(stdout)\nfor scanner.Scan() {\n    m := scanner.Text()\n    fmt.Println(m)\n    //if m=="3" {\n    //  return process(m)\n    //}\n}\ncmd.Wait()\n
Run Code Online (Sandbox Code Playgroud)\n

Jim*_*imB 3

将命令输出设置为 stdout:

cmd.Stdout = os.Stdout
Run Code Online (Sandbox Code Playgroud)

  • 下次一定要在问题中提及您想做的每件事,以避免提出这些问题:http://xyproblem.info/ (2认同)