知識ベース

孤立プロセス

孤立プロセスは、親プロセスが終了または終了したコンピュータープロセスですが、それ自体は実行されたままです。

Unixライク

Unixライクなオペレーティングシステムでは、孤立したプロセスは特別なinitシステムプロセスによって即座に採用されます。カーネルは親をinitに設定します。この操作は再ペアレント化と呼ばれ、自動的に実行されます。技術的にはプロセスの親として「init」プロセスがありますが、元々プロセスを作成したプロセスが存在しないため、孤立プロセスと呼ばれます。他のシステムでは、孤立したプロセスはカーネルによって即座に終了します。現代のLinuxシステムでは、孤立したプロセスはinitではなく「subreaper」プロセスに親にされる場合があります

親プロセスが終了またはクラッシュしたときなど、プロセスは意図せずに孤立する可能性があります。ほとんどのUnixライクなオペレーティングシステムのプロセスグループメカニズムは、ユーザーのシェルと連携して、子プロセスを「ハングアップ」シグナル(SIGHUP)で終了させようとする偶発的な孤児化から保護するために使用できます。孤児として実行を続けます。より正確には、ジョブ制御の一部として、シェルが終了すると、「セッションリーダー」であるため(セッションIDはプロセスIDと等しい)、対応するログインセッションが終了し、シェルはすべてのジョブ(内部表現)にSIGHUPを送信しますプロセスグループの)。

プロセスを意図的に孤立させることが望ましい場合があります。通常は、長時間実行されるジョブをユーザーの注意を引くことなく完了させたり、無期限に実行されるサービスやエージェントを開始したりします。このようなプロセス(セッションが関連付けられていない)は、特に無期限に実行されている場合、デーモンと呼ばれます。低レベルのアプローチは、2回フォークし、孫で目的のプロセスを実行し、すぐに子を終了することです。孫プロセスは現在孤立しており、祖父母ではなくinitによって採用されています。上位レベルの代替手段は、シェルのハングアップ処理を回避し、子プロセスにSIGHUPを無視するように指示するか(nohupを使用)、ジョブテーブルからジョブを削除するか、セッション終了時にSIGHUPを送信しないようにシェルに指示します(どちらの場合でもdisownを使用します) )。いずれにしても、セッションID(セッションリーダー、シェルのプロセスID)は変更されず、終了したセッションのプロセスIDは、すべての孤立プロセスが終了するか、セッションIDを変更する( setsid(2)による新しいセッション)。

システム管理を簡素化するには、サービスラッパーを使用して、サービスとして使用するように設計されていないプロセスがシステム信号に正しく応答するようにすることが望ましい場合がよくあります。プロセスを孤立せずに実行し続ける代わりに、ターミナルマルチプレクサを使用して、切り離されたセッション(または切り離されたセッション)でプロセスを実行することにより、セッションが終了せず、プ​​ロセスが孤立しないようにします。

サーバープロセスは、サーバープロセスの実行中に要求を行った後、要求を開始したクライアントが予期せずクラッシュした場合、孤立しているとも言われます。

これらの孤立したプロセスはサーバーリソースを浪費し、サーバーがリソース不足に陥る可能性があります。ただし、孤立プロセスの問題にはいくつかの解決策があります。

  1. 駆除は、最も一般的に使用される手法です。この場合、孤児は殺されます。
  2. 生まれ変わりは、マシンが定期的にリモート計算の親を見つけようとする手法です。その時点で、孤立プロセスが強制終了されます。
  3. 有効期限は、各プロセスが強制終了されるまでに一定の時間を割り当てる手法です。必要に応じて、割り当てられた時間が経過する前に、プロセスが終了するまでの時間を「求める」ことができます。