Linuxのゾンビプロセスとは何ですか?それらを殺す方法

ゾンビプロセス。 Linuxオペレーティングシステムに関連するこの興味深いが恐ろしい言葉を誰もが聞いたことがあるわけではありません。パーソナルコンピュータでは、ゾンビプロセスは通常のユーザーにとって脅威ではないかもしれませんが、Linuxサーバーに関しては、これらのプロセスを特定して停止する必要があります。

このようなプロセスは、システムのプロセステーブルに問題を引き起こし、マシンの適切な機能を改ざんする可能性があります。したがって、この記事では、Linuxマシンでゾンビプロセスを見つけて強制終了するための包括的なガイドとともに、ゾンビプロセスについて詳しく説明します。

ゾンビプロセスとは何ですか?

しかし、その前に、ゾンビプロセスが実際に何であるかを知っていることが重要です。これらは、システムプロセステーブルのスペースを占有する、死んで機能していないプロセスに他なりません。 プロセス制御ブロックまたはPCBは、システムで実行されている個々のプロセスに関連する詳細を格納するデータ構造です。

プロセステーブルは、プロセスID、PCBへのリンク、およびプロセスに関連するその他の有用な情報で構成されます。ゾンビプロセスには、独自のプロセスIDとメモリ管理情報があります。 Linux OSでは使用可能なプロセスIDの数が限られているため、ゾンビプロセスが停止するまで、他のプロセスはPIDを使用できません。

1つまたは2つのゾンビプロセスがコンピューターの中断やパフォーマンスの問題を引き起こすことはありませんが、そのようなプロセスが多数あると、プロセステーブルとリソースがいっぱいになり、システムのワークフローに悪影響を与える可能性があります。

Linuxでゾンビプロセスが発生する原因は何ですか?

ゾンビプロセスの根本的な原因を詳細に理解するには、Linuxでプロセスがどのように開始および停止するかを学ぶ必要があります。 Linuxオペレーティングシステムは、コンピューター上で実行中のすべてのプロセスとデーモンを監視します。プロセステーブルは、マシンで現在実行されているすべてのプロセスを含む構造のリストです。

プロセステーブルの各プロセスエントリは、その特定のプロセスのプロセス制御ブロックへのリンクで構成されています。 PCBは、その特定のプロセスに関連する詳細を保存します。これらの詳細は次のとおりです。

  1. プロセス状態プロセスの現在の状態
  2. プロセス番号プロセスを識別するために使用される一意の番号
  3. プログラムカウンター:次の命令に関連する情報が含まれています
  4. レジスタ:プロセスで使用されるすべてのCPUレジスタのリスト
  5. ファイルリストを開く:プロセスで使用されるファイル
  6. CPUスケジューリング情報:プロセスに割り当てられたCPU時間とリソースに関連する情報が含まれます
  7. メモリ管理情報:プロセスで使用されるメモリ量の詳細が含まれます
  8. I / O情報:プロセスで使用される入力デバイスまたは出力デバイスのリスト

Linuxは、次のプロセス状態を使用して、すべてのプロセスを記述します。

  • R :実行中のプロセス
  • S :睡眠過程
  • D :中断できない睡眠プロセス
  • T :終了したプロセス
  • Z :ゾンビプロセス

プロセスが割り当てられたタスクを完了するたびに、そのプロセス状態はゾンビまたはZとして設定されます。すべてのプロセスには、プロセスの状態変更を待機するwait()という名前の関数ファミリーを呼び出す親プロセスがあります。たとえば、プロセスの状態が「実行中」から「ゾンビ」に変わると、 wait()メソッドがトリガーされます。

wait()メソッドは通常、そのゾンビプロセスに関連するプロセス制御ブロックを削除してから、そのプロセスのエントリをプロセステーブルから削除します。

ただし、プログラムの開発が不十分なために、親プロセスがwait()関数を呼び出さない場合があります。その結果、システムはゾンビプロセスのPCBを削除しません。その特定のプロセスのプロセステーブルエントリもそのまま残ります。

これにより、ゾンビプロセスに無限の寿命が与えられます。システムはプロセスを強制終了できないため、プロセスエントリが削除されることはなく、PIDが解放されることもありません。

詳細: Linuxで応答しないプログラムを強制終了する方法

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

システム上のゾンビプロセスを削除するための最初のステップは、どのプロセスがゾンビプロセス状態にあるかを分析することです。システムがすでにメモリからこれらのプロセスを削除しているため、これらのプロセスを直接強制終了することはできませんが、それらに関連付けられている親プロセスを強制終了することはできます。

まず、システムのプロセステーブルにゾンビプロセスがあるかどうかを確認する必要があります。 topコマンドを使用して簡単に行うことができます。ターミナルを開いて次のように入力するだけです。

 top

これに似た出力が表示されます。ターミナルウィンドウの上部にあるゾンビプロセスの数に注目してください。出力がゼロの場合、心配する必要はありません。

psコマンドegrepとパイプ処理することにより、これらのゾンビプロセスに関連する情報を一覧表示できます。 Egrepは、Linuxのgrepコマンドの拡張であり、すべてのパターンを拡張正規表現文字列として扱います。

関連: Pythonを使用した正規表現の初心者向けガイド

次のコマンドを入力して、すべてのゾンビプロセスを一覧表示します。

 ps aux | egrep "Z|defunct"

前述のコマンドは、psコマンドによって生成れた出力にZまたは無効のいずれかを含む行を検索します。出力は、システムで実行されているゾンビプロセスのリストで構成されます。

killコマンドを使用してゾンビプロセスを強制終了する

現在、どのゾンビプロセスがシステムリソースを使い果たしているかがわかったので、次はこれらのプロセスを強制終了します。

ゾンビプロセスを強制終了する最も簡単な方法はコンピューターを再起動することですが、特にサーバーを管理している場合は、これが実行可能なオプションではない場合があります。

サーバーをシャットダウンせずにゾンビプロセスを強制終了するには、ゾンビプロセスのプロセスIDを書き留めます。前のセクションから、ゾンビプロセスのPIDが18614であることがわかります。次に、このPIDを使用して親プロセスのIDを見つけます。

 ps -o ppid= -p 18614

出力:

 18613

psコマンドを使用して、親プロセスIDが存在するかどうかを確認します。

 ps -e | grep 18613

親プロセスの存在を確認したので、それを強制終了します。次のように、 killコマンドで-SIGKILLフラグを渡します。

 sudo kill -SIGKILL 18613

親プロセスを強制終了すると、システムはゾンビプロセスを削除し、プロセステーブルから自動的に削除します。

Linuxでプロセスを効率的に管理する

すべてのシステム管理者は、Linuxマシンで実行されている監視プロセスに優先順位を付ける必要があります。ゾンビプロセスは必ずしもシステムに有害であるとは限りませんが、多数存在する場合はパフォーマンスの問題を引き起こす可能性があります。

Linuxの初心者で、Linuxオペレーティングシステムがプロセスをどのように管理するかがわからない場合は、最初にプロセスとは何かを学ぶことから始めるのがよいでしょう。