Process

什麼是“子收割機”過程?

  • December 18, 2015

在某些答案中使用了“subreaper”一詞。搜尋 Google 也會找到“剛剛使用”這個詞的條目。

我如何理解什麼是“子收割者”?

這是作為系統呼叫prctl()的標誌在Linux 核心 3.4中實現的。

prctl(2)手冊頁:

$$ … $$init(1)子收割機為其後代程序履行角色。在終止孤立的程序(即其直接父程序已經終止)並標記為具有子收割機時,最近的仍然活著的祖先子收割機將接收 SIGCHLD信號並能夠wait(2)在該程序上發現其終止狀態。

一個程序可以將自己定義為一個子收割者prctl(PR_SET_CHILD_SUBREAPER)。如果是這樣,它不是init(PID 1)將成為孤立子程序的父程序,而是標記為子收割者的最近的活著的祖父母將成為新的父程序。如果沒有在世的祖父母,init確實如此。

實現此機制的原因是使用者空間服務管理器/主管(如upstartsystemd)需要跟踪他們啟動的服務。許多服務通過雙重分叉來守護程序,並隱式地重新成為 PID 1 的父級。服務管理器將不再能夠接收SIGCHLD它們的信號,並且不再負責使用wait(). 在 PID 1 清理重新父程序時,有關子程序的所有資訊都會失去。現在,服務管理器程序可以將自己標記為一種“子初始化”,並且現在能夠作為已啟動服務創建的所有孤立程序的父程序。所有SIGCHLD信號都將傳遞給服務管理器。

在 Linux 中,通常通過分叉兩次來創建守護程序,中間程序在分叉孫子後退出。這是避免殭屍程序的常用技術。init 腳本呼叫一個子程序。那個孩子再次分叉,因此立即退出。孫子將被收養init,它不斷呼叫wait()收集他的孩子的退出狀態以避免殭屍。有了子收割者的概念,使用者空間服務管理器現在成為新的父節點,而不是init.

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