
所以我一直在到處讀到這個命令應該終止父進程的所有子進程:
kill -- -$$
在kill指令中使用負ID會引用PGID,從我看到的範例來看,子行程的PGID應該是父行程的PID,但在我的系統上並非如此。
在我的系統上,子腳本的 PGID 與父腳本的 PGID 相同,而父腳本是 bash。
這裡發生了什麼事?這些範例是錯誤的還是我的系統設定不同?
我需要實現的是終止子進程而不終止父進程,因此我不想向父進程所在的 PGID 發送終止訊號。
答案1
當一個進程被分叉時,它會從其父進程繼承其 PGID。當進程成為進程時,PGID 會發生變化流程組組長,然後從其 PID 複製其 PGID。從那時起,它產生的新子進程及其後代將繼承該 PGID(除非它們啟動自己的新進程組)。
在具有作業控制的 shell 中,例如大多數互動式 shell,每個作業都放在自己的進程組中。如果執行 shell 腳本,則執行該腳本的 shell 進程將成為群組長度,並且 PGID 將等於其 PID。
在沒有作業控制的 shell 中,例如大多數用於執行腳本的 shell,命令在 shell 的進程組中執行。
這個語法kill -- -N
會殺死 PGID = N 的群組中的所有進程。這基本上就是 shell 的方式
kill %jobid
語法有效-它在內部轉換%jobid
為作業的 PGID 並將訊號傳送到該 PGID。
沒有簡單的方法可以從另一個 shell 腳本在自己的進程組中執行腳本。看如何設定shell腳本的進程組不過,需要一些建議。