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

时间:2018-08-15 05:45:31

标签: bash 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服务器上运行。

有人可以建议我要去哪里

1 个答案:

答案 0 :(得分:7)

来自docs

  

等待命令退出后将关闭管道。

换句话说,当调用Wait()时,io.Copy退出,但是从不调用Wait,因为它被Copy阻止了。在goroutine中运行“复制”,或简单地将f分配给cmd.Stdout

f, err := os.Create(filepath.Join("/opt/log/", "execution.log"))
// TODO: Handle error
defer f.Close()

cmd := exec.Command("bash", "/opt/AlterKafkaTopic.sh")
cmd.Stdout = f
err = cmd.Run()