使用goroutine运行cmd.Wait()时的错误处理

时间:2019-08-12 04:13:03

标签: go goroutine

我试图在Golang中调用一些外部命令 non-blocking ,所以我使用了

cmd.Start()

go cmd.Wait()

尽管我不需要等待命令成功运行,但是运行cmd.wait()的原因是因为文档中提到了Wait releases any resources associated with the Cmd.",所以我不想造成资源泄漏。 / p>

但是,这种用法将导致linter报告错误,提醒我尚未处理错误。

Error return value of `cmd.Wait` is not checked (errcheck)
        go cmd.Wait()

如何处理go cmd.Wait()的错误?或者,如果我不运行go cmd.Wait(),是否会导致资源泄漏?

添加:

我使用go cmd.Wait()的原因之一是,如果我不使用它,则退出时,我启动的外部进程将变成僵尸进程。我还不知道为什么会这样。

2 个答案:

答案 0 :(得分:3)

您为什么要运行select Block, sum(DISTINCT amount) totalamount, sum(DISTINCT case when balance <> 0 then balance end) totalbalance from t1 group by Block; 作为goroutine?而且,如果您确实需要在goroutine中执行此操作,则可以尝试这样的操作。基本上将cmd.Wait()命令包装在内联go func中

cmd.Wait()

您还可以在go函数中进行错误检查。

答案 1 :(得分:2)

如果“ cmd”超出范围,则垃圾收集器将释放其引用。

   func execCommand() {
    exec.Command("something").Start()
}

func main() {
    execCommand()
    time.Sleep(time.Minute * 1)
}

因此,当执行命令时,类似这样的资源将被释放 exec.Wait命令用于获取退出代码,并等待从stdout或类似对象进行复制。

如果您仍然想使用cmd.Wait,则必须将其作为单独的功能启动,或者可以只使用exec.Run

go func(){
   err := cmd.Run() //or cmd.Wait()
   if err != nil {
      fmt.println("error ", err)    
      }
}()