在Goroutine中执行多个命令会在经过一些迭代后失败?

时间:2018-01-28 12:12:59

标签: go

我有一些执行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内部运行。

0 个答案:

没有答案