The following works just fine when cmd finishes in the allotted time. However, the timeout is not working. While it does print "It's dead Jim"
, not only does it fail to print "Done waiting"
, but the process is not actually killed. It continues to run, and "Done waiting"
never prints.
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
")
if err := cmd.Process.Signal(syscall.SIGKILL); err != nil {
fmt.Printf("Error:%s
", err)
}
fmt.Printf("It's dead Jim
")
}).Stop()
err := cmd.Wait()
fmt.Printf("Done waiting
")
}()
I don't think it should make a difference, but for what it's worth the command is go test html
. The reason it's timing out is because I'm injecting an error that causes an infinite loop before running it. To add to the confusion, I tried running it with go test net
. There was a timeout, and it worked correctly.
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…