问题:
执行长时间运行的 shell 命令时在使用 os/exec 的 Go 中,如何检索实时输出并在其变为时对其进行处理可用吗?
解决方案:
使用 stderr 而不是 stdout:
ffmpeg 已知将诊断消息输出到 stderr 而不是 stdout。因此,在创建命令对象时,请连接到 stderr 而不是 stdout。
连续读取 stderr 的输出:
创建 bufio.Scanner stderr 并使用 Scan 方法逐行或逐字读取输出word.
逐行处理输出:
在示例代码中,使用了scanner.Split(bufio.ScanWords)来分割空格上的输出。根据您的处理要求调整拆分类型。
处理输出:
以您想要的方式操作输出,例如提取和处理进度信息。
示例代码:
package main import ( "bufio" "fmt" "os/exec" "strings" ) func main() { args := "-i test.mp4 -acodec copy -vcodec copy -f flv rtmp://aaa/bbb" cmd := exec.Command("ffmpeg", strings.Split(args, " ")...) stderr, _ := cmd.StderrPipe() cmd.Start() scanner := bufio.NewScanner(stderr) scanner.Split(bufio.ScanWords) for scanner.Scan() { m := scanner.Text() fmt.Println(m) } cmd.Wait() }
输出:
代码会不断打印ffmpeg输出消息,如:
frame= 101 fps=0.0 q=28.0 size= 91kB time=00:00:04.13 bitrate= 181.2kbits/s
以上是如何在 Go 中获取 Shell 命令的实时输出?的详细内容。更多信息请关注PHP中文网其他相关文章!