为什么 Go 不会正确杀死子进程?

当 cmd 在分配的时间内完成时,以下工作正常。但是,超时不起作用。虽然它确实 print "It's dead Jim",但它不仅无法 print "Done waiting",而且该过程实际上并没有被杀死。它继续运行,"Done waiting"从不打印。


func() {

    var output bytes.Buffer

    cmd := exec.Command("Command", args...)

    cmd.Dir = filepath.Dir(srcFile)

    cmd.Stdout, cmd.Stderr = &output, &output

    if err := cmd.Start(); err != nil {

        return err

    }

    defer time.AfterFunc(time.Second*2, func() {

        fmt.Printf("Nobody got time fo that\n")

        if err := cmd.Process.Signal(syscall.SIGKILL); err != nil {

            fmt.Printf("Error:%s\n", err)

        }

        fmt.Printf("It's dead Jim\n")

    }).Stop()

    err := cmd.Wait()

    fmt.Printf("Done waiting\n")

}()

我不认为它应该有所作为,但值得命令的是go test html. 它超时的原因是因为我在运行它之前注入了一个导致无限循环的错误。为了增加混乱,我尝试使用go test net. 有一个超时,它工作正常。


紫衣仙女
浏览 229回答 3
3回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go