终止进程在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") } }
或者:
- 该过程结束,并通过
done
接收其错误(如果有的话) - 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() }