Wednesday, November 23, 2016

golang 啟動作業系統上的 process ,刪除時,連同 children processes 都一併清除

過去我在處理 golang 在作業系統上呼叫 process 的問題,是利用 stackoverflow 的範例程式碼。stackoverflow 的範例有考慮到 process 可能會執行太久,所以有處理 timeout 的問題,但是,少考慮到了一個問題: child process 和 grand child process 的問題。

當 golang 呼叫的外部 process 因為 timeout 的因素,而被 kill 的時候,如果只用 process id 去 kill ,而這個外部 process 已經有啟動了 child process 的話,就會造成它的 child process 都變成 orphan process 的問題。因為這些 child process 並不會因為 parent process 被 kill 而自動結束。

有考慮上述問題的有效作法,啟動外部的 process 時,要設定一個新的 process session id。如此,讓新增的 process 與 child process, grand child process 都使用新的 process session id 。當 timeout 發生的時候,對 process id 取負值後發送 kill signal 就可以將這些外部的 process 一次全部清除完畢。