以下代码完全符合我的要求,只是它只打印到控制台。cmd := exec.Command("php", "randomcommand.php")cmd.Stdout = os.Stdoutcmd.Stderr = os.Stderrif err := cmd.Run(); err != nil { log.Fatal(err)}随机命令.php:// randomcommand.php simply alternates output between stdout and stderr 20 times$stdout = fopen('php://stdout', 'w+');$stderr = fopen('php://stderr', 'w+');for ($i = 1;$i <= 20; $i++) { fwrite($stdout, "stdout $i\n"); fwrite($stderr, "stderr $i\n");}输出:stdout 1stderr 1stdout 2stderr 2stdout 3stderr 3stdout 4stderr 4stdout 5stderr 5stdout 6stderr 6stdout 7stderr 7stdout 8stderr 8stdout 9stderr 9stdout 10stderr 10stdout 11stderr 11stdout 12stderr 12stdout 13stderr 13stdout 14stderr 14stdout 15stderr 15stdout 16stderr 16stdout 17stderr 17stdout 18stderr 18stdout 19stderr 19stdout 20stderr 20我想要实现的是:将命令的stdout和stderr实时打印到控制台;将命令的 stdout 和 stderr 记录到一个文件中,就像它在控制台中显示的那样;尊重写入 stdout 和 stderr 的确切顺序,并且;不修改命令本身我已经尝试将命令 stdout 和 stderr 输入扫描仪或使用 io.Copy,每个都在 goroutine 中,但未维护输出顺序。可能是因为 goroutine 之间的交替必须与输出交替同时发生,这几乎是不可能的。我也尝试过使用“中选择”作为从例子在这里。但是输出的顺序没有得到维持。Logstreamer 也有同样的问题。我必须尝试的另一个想法是看看我是否可以以某种方式从控制台缓冲区读取,但这感觉不对。有谁知道这是否可能并且值得追求?
1 回答
- 1 回答
- 0 关注
- 326 浏览
添加回答
举报
0/150
提交
取消