我试图在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()
的原因之一是,如果我不使用它,则退出时,我启动的外部进程将变成僵尸进程。我还不知道为什么会这样。
答案 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)
}
}()