Shell-Script

為什麼我的子程序的 PGID 不是父程序的 PID?

  • January 12, 2021

所以我一直在到處讀到這個命令應該終止父程序的所有子程序:

kill -- -$$

使用帶有 kill 命令的負 ID 引用 PGID 並且從我看到的範例中看來,子程序的 PGID 應該是父程序的 PID,但在我的系統上並非如此。

在我的系統上,孩子的 PGID 與父腳本的 PGID 相同,結果是 bash。

這裡發生了什麼?範例是錯誤的還是我的系統設置不同?

我需要實現的是在不終止父程序的情況下終止子程序,因此我不想向父程序所在的 PGID 發送終止信號。

當一個程序被分叉時,它會從其父程序繼承其 PGID。當程序成為程序組組長時,PGID 會發生變化,然後從其 PID 複製其 PGID。從那時起,它產生的新子程序及其後代將繼承該 PGID(除非它們啟動自己的新程序組)。

在具有作業控制的 shell 中,例如大多數互動式 shell,每個作業都放在自己的程序組中。如果你執行一個 shell 腳本,執行該腳本的 shell 程序將是組長,並且 PGID 將等於它的 PID。

在沒有作業控制的 shell 中,例如大多數用於執行腳本的 shell,命令在 shell 的程序組中執行。

該語法kill -- -N使用 PGID = N 殺死組中的所有程序。您不能將其與任意 PID 一起使用,只能使用程序組領導的 PID,因為那是 PGID。這基本上就是shell的

kill %jobid

語法有效——它在內部轉換%jobid為作業的 PGID 並將信號發送到該 PGID。

沒有簡單的方法可以從另一個 shell 腳本在自己的程序組中執行腳本。不過,請參閱如何設置 shell 腳本的程序組以獲取一些建議。

引用自:https://unix.stackexchange.com/questions/139222