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服务器上运行。
有人可以建议我要去哪里
答案 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()