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