脚本命令执行永远挂在 go 程序中

func Run() error {

    log.Info("In Run Command")

    cmd := exec.Command("bash", "/opt/AlterKafkaTopic.sh")

    stdout, err := cmd.StdoutPipe()

    if err != nil {

            return err

    }

    if err = cmd.Start(); err != nil {

           return err

    }

    f, err := os.Create(filepath.Join("/opt/log/", "execution.log"))

    if err != nil {

            return err

    }

    if _, err := io.Copy(f, stdout); err != nil {

            return err

    }

         if err := cmd.Wait(); err != nil {

            return err

    }

     return f.Close()

}


我正在尝试从 go 代码执行 bash 脚本。该脚本更改了一些 kafka 主题属性。但是执行挂起io.Copy(f, stdout)并且在它之后不会继续。本程序运行在RHEL7.2服务器上。


有人可以建议我哪里出错了


扬帆大鱼
浏览 99回答 1
1回答

FFIVE

从文档:Wait 将在看到命令退出后关闭管道。换句话说,io.Copy 在 Wait() 被调用时退出,但 Wait 永远不会被调用,因为它被 Copy 阻塞了。在 goroutine 中运行 Copy,或者简单地分配f给cmd.Stdout:f, err := os.Create(filepath.Join("/opt/log/", "execution.log"))// TODO: Handle errordefer f.Close()cmd := exec.Command("bash", "/opt/AlterKafkaTopic.sh")cmd.Stdout = ferr = cmd.Run()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go