首页 > 后端开发 > Golang > 正文

如何使用 Go 实时流式传输命令输出?

Mary-Kate Olsen
发布: 2024-11-22 00:04:17
原创
889 人浏览过

How to Stream Command Output in Real-Time Using Go?

在线流式传输命令输出

考虑以下执行命令并捕获其输出的代码:

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]
    // Wait to finish, get output:
    out, err := cmd.Output()
    if err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Println("Finished %s, output: %s", cp[1:], out)
}
登录后复制

此代码捕获命令的完整输出,并仅在命令完成执行后打印它。但是,需要实时流式输出。

要实现实时输出流式传输,我们可以修改代码如下:

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}
for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}
登录后复制

以下是更改的说明:

  • cmd.StdoutPipe() 创建一个用于读取命令标准的管道输出。
  • cmd.Start() 在后台启动命令。
  • bufio.NewScanner(stdout) 创建一个扫描器,用于从 stdout 管道读取。
  • 扫描器。 Split(bufio.ScanRunes) 设置扫描仪按符文读取,提供实时流媒体。
  • 扫描仪的Scan() 循环不断读取并打印命令生成的每个符文(字符)。
  • 循环完成后(写入标准输出的命令已完成),scanner.Err() 检查是否有任何错误。
  • cmd.Wait() 等待命令完成并检查错误。
  • 最后的 log.Println() 语句记录命令的完成。

以上是如何使用 Go 实时流式传输命令输出?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板