首页 > 后端开发 > Golang > 如何实时流式传输命令输出而不是等待执行完成?

如何实时流式传输命令输出而不是等待执行完成?

Mary-Kate Olsen
发布: 2024-11-17 21:00:03
原创
402 人浏览过

How to Stream Command Output in Real-time Instead of Waiting for Execution Completion?

运行命令并流式传输其输出

问题:延迟输出显示

当前,您的代码处理一个命令并仅在执行完成后显示其输出。您寻求一种实时流式传输输出的解决方案,而不是等待进程完成。

解决方案:命令输出流

采用以下方法来流式传输命令输出:

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() 创建一个管道,该管道将提供命令写入的任何输出。
  • scanner := bufio.NewScanner(stdout) 初始化将从管道读取输出的扫描仪。
  • scanner.Split(bufio.ScanRunes) 确保扫描仪读取并处理输出的每个字符(符文)。
  • for 循环不断从 stdout 管道读取字符并将其打印到屏幕上。
  • 命令执行完成后,cmd.Wait() 检查其成功或失败并记录结果。

以上是如何实时流式传输命令输出而不是等待执行完成?的详细内容。更多信息请关注PHP中文网其他相关文章!

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