以下代码完全符合我的要求,只是它只打印到控制台。
cmd := exec.Command("php", "randomcommand.php")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
if 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 1
stderr 1
stdout 2
stderr 2
stdout 3
stderr 3
stdout 4
stderr 4
stdout 5
stderr 5
stdout 6
stderr 6
stdout 7
stderr 7
stdout 8
stderr 8
stdout 9
stderr 9
stdout 10
stderr 10
stdout 11
stderr 11
stdout 12
stderr 12
stdout 13
stderr 13
stdout 14
stderr 14
stdout 15
stderr 15
stdout 16
stderr 16
stdout 17
stderr 17
stdout 18
stderr 18
stdout 19
stderr 19
stdout 20
stderr 20
我想要实现的是:
将命令的stdout和stderr实时打印到控制台;
将命令的 stdout 和 stderr 记录到一个文件中,就像它在控制台中显示的那样;
尊重写入 stdout 和 stderr 的确切顺序,并且;
不修改命令本身
我已经尝试将命令 stdout 和 stderr 输入扫描仪或使用 io.Copy,每个都在 goroutine 中,但未维护输出顺序。可能是因为 goroutine 之间的交替必须与输出交替同时发生,这几乎是不可能的。
我也尝试过使用“中选择”作为从例子在这里。但是输出的顺序没有得到维持。
Logstreamer 也有同样的问题。
我必须尝试的另一个想法是看看我是否可以以某种方式从控制台缓冲区读取,但这感觉不对。
有谁知道这是否可能并且值得追求?
相关分类