1package exec2 2 3import ( 4 "os/exec" 5 "time" 6) 7 8//exec another process 9//if wait d Duration, it will kill the process 10//d is <= 0, wait forever 11func ExecTimeout(d time.Duration, name string, args ...string) error { 12 cmd := exec.Command(name, args...) 13 14 if err := cmd.Start(); err != nil { 15 return err 16 } 17 18 if d <= 0 { 19 return cmd.Wait() 20 } 21 22 done := make(chan error) 23 go func() { 24 done <- cmd.Wait() 25 }() 26 27 select { 28 case <-time.After(d): 29 cmd.Process.Kill() 30 31 //wait goroutine return 32 return <-done 33 case err := <-done: 34 return err 35 } 36} 37