终止进程在Golang中使用os / exec开始

有没有办法来终止在Golang中使用os.exec启动的进程? 例如(来自http://golang.org/pkg/os/exec/#example_Cmd_Start ),

cmd := exec.Command("sleep", "5") err := cmd.Start() if err != nil { log.Fatal(err) } log.Printf("Waiting for command to finish...") err = cmd.Wait() log.Printf("Command finished with error: %v", err) 

有没有办法提前终止这个过程,也许3秒后呢?

提前致谢

启动命令后:

 done := make(chan error, 1) go func() { done <- cmd.Wait() }() select { case <-time.After(3 * time.Second): if err := cmd.Process.Kill(); err != nil { log.Fatal("failed to kill: ", err) } log.Println("process killed as timeout reached") case err := <-done: if err != nil { log.Printf("process done with error = %v", err) } else { log.Print("process done gracefully without error") } } 

或者:

  1. 该过程结束,并通过done接收其错误(如果有的话)
  2. 3秒过去了,程序被杀死了。

一个简单的版本没有select和渠道。

 func main() { cmd := exec.Command("cat", "/dev/urandom") cmd.Start() timer := time.AfterFunc(1*time.Second, func() { err := cmd.Process.Kill() if err != nil { panic(err) // panic as can't kill a process. } }) err := cmd.Wait() timer.Stop() // read error from here, you will notice the kill from the fmt.Println(err) } 

那么,在咨询了一些经验丰富的程序员之后,这显然不是解决问题的方法。 所以请参考接受的答案。


这是一个更短的版本,非常简单。 但是,如果超时时间很长,可能会有大量的悬挂门厅。

 func main() { cmd := exec.Command("cat", "/dev/urandom") cmd.Start() go func(){ time.Sleep(timeout) cmd.Process.Kill() }() return cmd.Wait() }