2012-08-09 24 views

回答

88

啓動命令後:

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秒鐘的時間接收已經通過並且程序被殺死了。
+5

注意:殺死進程後,Wait()將返回。您應該在'err:= cmd.Process.Kill()'之後完成一次拉取操作,以防止內存泄漏。 – 2012-08-09 15:35:35

+0

謝謝。這似乎或多或少是我所期待的。 – Tech163 2012-08-09 15:36:07

+0

@StephenWeinberg沒錯,我會補充一點。 – 2012-08-09 15:40:18

5

一個簡單的版本沒有選擇和渠道。

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() 
} 
相關問題