GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでZombieプロセスを強制終了する方法

Linuxのゾンビプロセスとは、すでに死んでいるプロセスを指しますが、何らかの形で、システムのプロセステーブルにまだ存在しています。抜け穴は、何らかの理由で、このプロセスがプロセステーブルから親によってクリーンアップされなかったことです。通常、これは実行プロセスの完了後に発生します。

Linuxでの通常の操作方法は、プロセスが実行を完了した後、テーブルからプロセスを削除する責任がある親に通知することです。残念ながら、親が子のステータスを読み取れない場合、親はプロセスをメモリから削除できません。このようにして、プロセステーブルにデッドプロセスが存在するようになります。これらは、私たちがゾンビプロセスと呼んでいるものです。

Linuxゾンビプロセスの原因は何ですか?

子プロセスが作成されると、不適切に記述された親プロセスがwait()関数の呼び出しに失敗する可能性があります。その結果、そのゾンビの子供たちは、彼らが消滅するまで記憶に残ります。

これは、状態の変化について幼児プロセスを監視しているものはなく、SIGCHLDシグナルは無視されることを意味します。おそらく、別のアプリケーションが、お粗末なプログラミングまたは悪意のある意図のいずれかによって、親プロセスの実行を妨害しています。

親プロセスが子プロセスの状態変化を監視していない場合、適切なシステムハウスキーピングは行われません。

インファントプロセスが終了しても、PCBとプロセステーブルのエントリは削除されません。この結果、ゾンビの状態がPCBから削除されることはありません。

ゾンビにはある程度の記憶がありますが、通常は問題にはなりません。 Linuxシステムには有限数のPIDがあるため(多数ではありますが)、十分な数のPIDがゾンビ化されている場合、他のプロセスを開始できません。これが起こるかどうかは疑わしいです。

ただし、ゾンビ化されたプロセスは、アプリケーションに問題があり、特定のプログラムにバグがある可能性があることを示唆しています。
データセンターのソフトウェアのバグは許容されるべきではなく、対処する必要があります。
注意が必要です。障害が修正されるまで、ゾンビプロセスを探し出し、破壊します。

プロセスIDは起動するまで再利用できないため、プロセステーブルのエントリはごくわずかです。
PCBは64ビットオペレーティングシステムのプロセステーブルエントリよりもはるかに大きいため、問題が発生する可能性はほとんどありません。 。

他のプロセスで使用可能なメモリの量は、多数のゾンビの影響を受ける可能性があります。ただし、ゾンビの数が多い場合は、親アプリケーションに重大な問題があるか、オペレーティングシステムにバグがあります。

では、手順がゾンビに変わったらどうしますか?ゾンビプロセスを追跡して排除します。

ゾンビプロセスを見つける方法は?

システム内のゾンビプロセスを強制終了するための最初の停止は、最初にそれを識別することです。 initプロセスはゾンビの後に定期的にクリーンアップするため、ゾンビを取り除くために必要なのは、ゾンビを作成したプロセスを破棄することだけです。

一番上のコマンドは、お住まいの地域にゾンビがいるかどうかをすばやく確認する方法です。これを実現するために、次のコマンドを実行します。

top

このシステムのゾンビプロセスの数が出力に表示されます。上記の例では、ゾンビは0人です。
psコマンドを使用してegrepにパイプすると、ゾンビのリストを取得できます。ゾンビプロセスの状態フラグは「Z」であり、「defunct」も表示される場合があります。

tuts@fosslinux:~$ ps aux | egrep "Z|defunct"

このコマンドのさまざまなセクションを分解してみましょう。

出力のSTAT列のZは、ゾンビプロセスを識別します。
出力の最後の(COMMAND)列の[defunct]も、ゾンビプロセスを識別します。

理想的には、ゾンビプロセスは死んでいるため、殺すことはできません。代わりに、子のプロセスステータスを読み取って読み取り、最終的にシステムのテーブルから削除するように親に通知します。このプロセスをトリガーするために、SIGCHLDシグナルをプロセスの親に送信します。親プロセスIDまたはいわゆるPIDを特定するには、次のコマンドを実行する必要があります。

tuts@fosslinux:~$ ps -o ppid= <Child PID>

ゾンビのPIDを取得したら、コマンドSIGCHLDシグナルを使用して、以前に識別された親プロセスに送信します。

tuts@fosslinux:~$ kill -s SIGCHLD <Parent PID>

場合によっては、これでゾンビプロセスがクリアされないことがあります。これにより、プランbまたはcに従事するように求められます。以前は、親プロセスを再起動するか、親プロセスを強制終了する必要があります。一方、後者の場合は、特にゾンビプロセスが原因で停止または大規模なサージを引き起こす可能性がある場合に、システムの再起動を行う必要があります。

以下は、親プロセスを強制終了するコマンドです。

tuts@fosslinux:~$ kill -9 <Parent PID>

親プロセスが強制終了された場合、拡張により、指定された親のすべての子プロセスも強制終了されます。子プロセスの1つが特定の時点で重要である場合、安全になるまで殺害を延期する必要があるかもしれません。一方、簡単なダブルチェックにより、ゾンビプロセスが消費しているメモリまたは処理能力を知ることができます。これは、すでにスケジュールされているシステムメンテナンスの次のサイクルで、親プロセッサを強制終了してシステムを再起動するのが適切かどうかを判断するのに役立ちます。

Linuxでは、プロセスの状態はどのように機能しますか?

もちろん、Linuxは、コンピューターで実行されているすべてのアプリケーションとデーモンを追跡する必要があります。プロセステーブルを維持することは、これを実現する方法の1つです。
これは、カーネルメモリ構造のリストです。このリストには、プロセスに関するいくつかの情報を含む各プロセスのエントリが含まれています。各プロセステーブル構造には、ほとんど情報が含まれていません。

これらは、プロセスID、その他のいくつかの情報、およびプロセス制御ブロック(PCB)へのポインターを格納します。

PCBは、Linuxが各プロセスで検索または設定するために必要なすべての情報を格納する場所です。プロセスが作成されると、プロセスは変更され、処理時間が与えられてから破棄されます。

LinuxPCBには95を超えるフィールドがあります。これは、700行を超える長さのタスク構造で定義されています。 PCBには、次の種類の情報があります。

プロセスの状態を以下に示します

  • プロセス番号:オペレーティングシステムの固有の識別子。
  • プログラムカウンター:このプロセスにCPUへのアクセスが再度許可されると、システムはこのアドレスを使用して、実行されるプロセスの次の命令を見つけます。
  • レジスタ:この手順では、レジスタと呼ばれるCPUレジスタのリストを使用します。アキュムレータ、インデックスレジスタ、およびスタックポインタがリストに含まれる場合があります。
  • オープンファイルリスト:この手順に関連するファイルは、オープンファイルリストに含まれています。
  • CPUスケジューリング情報:このプロセスがCPU処理時間を受け取る頻度と期間を計算するために使用されます。
    PCBは、プロセスの優先度、スケジューリングキューへのポインター、およびその他のスケジューリングパラメーターを記録する必要があります。
  • メモリ管理情報:プロセスメモリの開始アドレスと終了アドレス、メモリページへのポインタなど、このプロセスが使用しているメモリに関する情報。
  • I / Oステータスに関する情報:プロセスが入力または出力として使用するすべてのデバイス。

次のいずれかが「プロセス状態」になる可能性があります:

  • R:実行中または実行可能なプロセス。実行中です。つまり、CPUサイクルを取得して実行しています。
    実行の準備ができているプロシージャは、CPUスロットを待機しています。
  • S:スリープする動作。
    プロセスは、入力または出力操作などのアクションの完了を待機しています。または、リソースの可用性。
  • D:手順は中断できない睡眠の状態にあります。ブロッキングシステムコールを使用しています。つまり、システムコールが完了するまで続行されません。 「スリープ」状態とは異なり、この状態のプロセスは、システムコールが完了し、実行がプロセスに戻るまで、シグナルに応答しません。
  • T:SIGSTOPシグナルを受け取ったため、プロセスは終了(停止)しました。
    SIGKILLまたはSIGCONTシグナルにのみ応答し、プロセスを強制終了するか、続行するように指示します。フォアグラウンド(fg)タスクからバックグラウンド(bg)タスクに切り替えると、これが発生します。
  • Z:ゾンビプロセスの略です。プロセスが終了しても、それは単に消えるわけではありません。代わりに、現在使用しているメモリを解放してメモリを終了しますが、プロセステーブルのエントリとPCBは残ります。
    その状態はEXIT ZOMBIEに設定され、親プロセスは幼児プロセスが完了したことを通知されます。 SIGCHLDシグナル。

結論

彼らが広大な大群の一部でない限り、ゾンビはそれほど有害ではありません。いくつかは大したことではなく、すばやく再起動するとそれらがクリアされます。ただし、考慮すべき点が1つあります。

Linuxアーキテクチャには最大数のプロセスがあり、その結果、最大数のプロセスID番号があります。コンピューターのゾンビプロセスの最大数に達すると、新しいプロセスを開始できなくなります。

ゾンビプロセスはプロセスではありません。それらは、親プロセスが正しくクリーンアップされていないデッドプロセスの残骸です。ただし、特定のアプリケーションまたはプロセスが常にゾンビを生成していることに気付いた場合は、さらに調査する必要があります。

おそらく、それは単に不十分に書かれたプログラムです。その場合、子が適切に処理された後にクリーンアップされる更新バージョンがある可能性があります。


Linux
  1. Linuxでゾンビプロセスを強制終了する方法

  2. Linuxでゾンビプロセスを見つけて殺す方法

  3. ゾンビプロセスとは何ですか?ゾンビプロセスを見つけて殺す方法は?

  1. Linuxで実行中のプロセスを強制終了する方法

  2. コマンドを使用してLinuxでプロセスを強制終了する方法は?

  3. Linux:ゾンビ プロセスを見つけて強制終了する

  1. Linuxでプロセスを強制終了する方法またはプログラムを停止する方法

  2. ゾンビプロセスを強制終了する方法

  3. Linux でプロセスを一時停止/再開する方法