如何在实时输出时将命令的 stdout 和 stderr 重定向到控制台和日志文件?

以下代码完全符合我的要求,只是它只打印到控制台。


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

我想要实现的是:

  1. 将命令的stdout和stderr实时打印到控制台;

  2. 将命令的 stdout 和 stderr 记录到一个文件中,就像它在控制台中显示的那样;

  3. 尊重写入 stdout 和 stderr 的确切顺序,并且;

  4. 不修改命令本身

我已经尝试将命令 stdout 和 stderr 输入扫描仪或使用 io.Copy,每个都在 goroutine 中,但未维护输出顺序。可能是因为 goroutine 之间的交替必须与输出交替同时发生,这几乎是不可能的。

我也尝试过使用“中选择”作为从例子在这里。但是输出的顺序没有得到维持。

Logstreamer 也有同样的问题。

我必须尝试的另一个想法是看看我是否可以以某种方式从控制台缓冲区读取,但这感觉不对。

有谁知道这是否可能并且值得追求?


FFIVE
浏览 328回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go