相关疑难解决方法(0)

流命令输出进度

我正在编写一个服务,必须将已执行命令的输出流式传输到父级和日志.当有一个漫长的过程时,问题是cmd.StdoutPipe给我一个最终的(字符串)结果.

是否可以给出正在发生的事情的部分输出,比如在shell中

func main() {
    cmd := exec.Command("sh", "-c", "some long runnig task")

    stdout, _ := cmd.StdoutPipe()
    cmd.Start()

    scanner := bufio.NewScanner(stdout)
    for scanner.Scan() {
        m := scanner.Text()
        fmt.Println(m)
        log.Printf(m)
    }

    cmd.Wait()
}
Run Code Online (Sandbox Code Playgroud)

PS只是输出将是:

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

但就我而言,这还不够.

execution go

9
推荐指数
1
解决办法
2847
查看次数

在 Go 中实时打印来自 exec 命令的标准输出

我有一个小的 Go 工具,它基本上允许用户定义一个命令,然后使用os/exec.

我的问题是我想向用户显示命令的输出(stdout/stderr)。

一个例子可能是这样的:用户定义了一个命令,最后是sh test.sh. test.sh 的内容:

echo "Start"
sleep 7s
echo "Done"
Run Code Online (Sandbox Code Playgroud)

使用我当前的实现,用户只能在完整命令完成后才能看到输出。在上面的示例中,用户在命令和第二个完成之前不会看到输出Startsleepecho

我目前检索命令的输出是这样的:

cmd := exec.Command(command, args...)
cmd.Dir = dir
// Attach to the standard out to read what the command might print
stdout, err := cmd.StdoutPipe()
if err != nil {
    log.Panic(err)
}
// Execute the command
if err := cmd.Start(); err != nil {
    log.Panic(err)
}

buf := new(bytes.Buffer)
buf.ReadFrom(stdout)
log.Print(buf.String())
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式实时读取 stdout/stderr 。这意味着一旦用户定义的命令创建并输出它就会被打印出来?

stdout exec go

5
推荐指数
1
解决办法
6695
查看次数

标签 统计

go ×2

exec ×1

execution ×1

stdout ×1