「サブリーパー」という言葉は、いくつかの回答で使用されています。Googleを検索すると、単語が「使用された」というエントリも検索されます。
「サブリーパー」とは何ですか?
「サブリーパー」という言葉は、いくつかの回答で使用されています。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
。