为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
扬帆大鱼 2023-03-21 15:04:56
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 回答

?
FFIVE

TA贡献1797条经验 获得超6个赞

从文档:

Wait 将在看到命令退出后关闭管道。

换句话说,io.Copy 在 Wait() 被调用时退出,但 Wait 永远不会被调用,因为它被 Copy 阻塞了。在 goroutine 中运行 Copy,或者简单地分配fcmd.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()


查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 68 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信