「サブリーパー」プロセスとは何ですか?


39

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

「サブリーパー」とは何ですか?


3
言葉を聞いたことがありません。コンテキストの参照を含めることができますか?
セラダ

5
1つです:unix.stackexchange.com/a/177361/5132の回答で使用しました。
JdeBP

おそらく、私はserverfaultののではなく、ここに掲載されている必要があることを関連質問serverfault.com/questions/747070/...
artfulrobot

回答:


50

これは、システムコール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では、通常、孫をフォークした後に中間プロセスを終了して2回フォークすることにより、デーモンが作成されます。これは、ゾンビプロセスを回避する一般的な手法です。initスクリプトは子を呼び出します。その子は再び分岐し、すぐに終了します。孫はに採用されinitwait()ゾンビを避けるために子供の退出状況を継続的に収集します。サブリーパーの概念により、ユーザースペースサービスマネージャーがの代わりに新しい親になりましたinit


だから、プロセスは「サブ」プロセスを「刈り取る」と考えることができますか?または、「メイン」リーパーが初期化されているため、プロセスは「サブ」リーパーですか?用語がどのように造られたかを考えようとしています。答えてくれてありがとう!
ケンチュー

3
上記のLinuxカーネル3.4リンクに従って、 この実装のコミットコメントに詳細があります。(gitコメントに隠された詳細にw敬の念)
ケンチュー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.