「サブリーパー」という言葉は、いくつかの回答で使用されています。 Googleを検索すると、その単語が「使用されたばかり」のエントリも表示されます。
「サブリーパー」とはどうすればわかりますか?
承認された回答:
これは、システムコールprctl()のフラグとしてLinuxカーネル3.4に実装されました。
prctl(2)
から マンページ:
[…]サブリーパーは
init(1)
の役割を果たします その子孫
プロセスのために。孤立している(つまり、その直接の親がすでに終了している)プロセスが終了し、
サブリーパーがあるとマークされると、最も近いまだ生きている祖先サブリーパーはSIGCHLD
を受け取ります。 信号を送り、wait(2)
できるようにする
終了ステータスを検出するプロセスについて。
プロセスは、prctl(PR_SET_CHILD_SUBREAPER)
を使用して自分自身をサブリーパーとして定義できます。 。もしそうなら、それはinit
ではありません (PID 1)は、孤立した子プロセスの親になります。代わりに、サブリーパーとしてマークされている最も近い生きている祖父母が新しい親になります。生きている祖父母がいない場合は、init
このメカニズムを実装する理由は、ユーザースペースサービスマネージャー/スーパーバイザー(upstart
など)でした。 、systemd
)開始したサービスを追跡する必要があります。多くのサービスはダブルフォークによってデーモン化され、暗黙的にPID 1に再ペアレント化されます。サービスマネージャーは、SIGCHLD
を受信できなくなります。 彼らのために合図し、wait()
で子供たちを刈り取る責任はもうありません 。 PID 1が再ペアレント化されたプロセスをクリーンアップした時点で、子に関するすべての情報が失われます。これで、サービスマネージャープロセスはそれ自体を一種の「サブ初期化」としてマークでき、開始されたサービスによって作成されたすべての孤立したプロセスの親として残ります。すべてのSIGCHLD
信号はサービスマネージャーに配信されます。
Linuxでは、デーモンは通常、孫をフォークした後に中間プロセスを終了して2回フォークすることによって作成されます。これは、ゾンビプロセスを回避するための一般的な手法です。 initスクリプトは子を呼び出します。その子は再びフォークし、すぐに終了します。孫はinit
に採用されます 、wait()
を継続的に呼び出します ゾンビを避けるために彼の子供たちの終了ステータスを収集します。サブリーパーの概念により、ユーザースペースサービスマネージャーがinit
ではなく新しい親になります。 。