我有一些执行shell命令的长期运行的goroutine。在运行任意数量的命令后,此操作失败(对于此示例,在我的Linux机器上为288次,对于我的Mac,为400次)。如果我在goroutine之外运行完全相同的代码,它会按预期继续运行而不会停止或出错。我通过设置断点尝试调试,但无济于事。任何帮助将不胜感激。
不起作用:
func main() {
go doAlot()
for {
}
}
func doAlot() {
i := 0
for {
time.Sleep(time.Millisecond * 100)
cmd := exec.Command("echo", "hello")
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
fmt.Printf("%d \nout: %serr: %s\n", i, outStr, errStr)
i++
}
}
使用:
func main() {
i := 0
for {
time.Sleep(time.Millisecond * 100)
cmd := exec.Command("echo", "hello")
var stdout, stderr bytes.Buffer
cmd.Stdout = &stdout
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
log.Fatalf("cmd.Run() failed with %s\n", err)
}
outStr, errStr := string(stdout.Bytes()), string(stderr.Bytes())
fmt.Printf("%d\nout: %serr: %s\n", i, outStr, errStr)
i++
}
}
我唯一的(没有受过教育/狂野的)猜测,它与垃圾收集和缓冲区有关,但不知何故专门用于在goroutine内部运行。