1. 概要

このチュートリアルでは、ゾンビプロセスとそれらをクリーンアップする方法について学習します。 まず、さまざまなプロセス状態を理解します。 次に、ゾンビプロセスを特定する方法を確認します。 最後に、問題の解決策に到達します。

2. ゾンビプロセスとは

Linuxのゾンビプロセスは、無効またはデッドプロセスとも呼ばれます。 それらは実行を完了したプロセスですが、それらのエントリはプロセステーブルから削除されません。

2.1. プロセス状態

Linuxは、実行中のすべてのプロセスのプロセステーブルとその状態を維持します。 さまざまなプロセス状態の概要を簡単に説明します。

  1. 実行中(R):これらのプロセスは現在実行中または実行可能です。
  2. 待機中(S / D):これらはイベントまたはリソースを待機しているプロセスです。 待機は、中断可能なスリープ(S)または中断不可能なスリープ(D)のいずれかです。
  3. 停止(T):適切なシグナルを送信することでLinuxプロセスを停止できます。
  4. ゾンビ(Z):プロセスがタスクを終了すると、使用していたシステムリソースを解放し、メモリをクリーンアップします。 ただし、プロセステーブルからのエントリは削除されず、ステータスはEXIT_ZOMBIEに設定されます。

次のサブセクションでは、ゾンビプロセスの概念について理解を深めます。

2.2. ゾンビプロセスの作成

プロセスがジョブを完了すると、Linuxカーネルは SIGCHLD シグナルを送信して、終了しているプロセスの親に通知します。 次に、親は wait()システムコールを実行して子プロセスのステータスを読み取り、そのexitコードを読み取ります。 これにより、プロセステーブルから子プロセスのエントリもクリーンアップされるため、プロセスが終了します。

ただし、親プロセスが子プロセスの作成時にwait()システム呼び出しを実行するようにプログラムされていない場合、適切なクリーンアップは行われません。 このような場合、親プロセスは子プロセスの状態変化を監視できず、最終的にはSIGCHLD信号を無視します。 これにより、終了したプロセスのゾンビ状態がプロセステーブルに残り、プロセスリストにゾンビプロセスとして表示されます。

もう1つの重要なケースは、親プロセスが子プロセスからSIGCHLDシグナルを処理または受信できない場合です。 このような場合もゾンビの作成につながります。

2.3. ゾンビプロセスの識別

ps コマンドを使用して、ゾンビのリストを識別できます。

$ ps ux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
shubh        9  0.0  0.0  16916  2760 tty1     S    Dec19   0:00 /bin/bash --login
shubh      108  0.0  0.0      0     0 tty1     Z    16:25   0:00 [zombie] <defunct> 
shubh      109  0.0  0.0  17384  1928 tty2     R    16:25   0:00 ps ux

出力から観察されるように、 Z の中に STAT 列またはゾンビまたの出力からのパターン ps コマンドを使用してゾンビを識別することができます。

awk コマンドを使用して、Zプロセス状態に基づいて出力をさらにフィルタリングしてみましょう。

$ ps ux | awk '{if($8=="Z") print}'
shubh       108  0.0  0.0      0     0 tty1     Z    16:25   0:00 [zombie] <defunct>

ゾンビプロセスの数とリストを確認するもう1つの便利な方法は、topコマンドを使用することです。

$ top
Tasks:   8 total,   1 running,   6 sleeping,   0 stopped,   1 zombie
%Cpu(s):  0.7 us,  1.6 sy,  0.0 ni, 96.5 id,  0.0 wa,  1.2 hi,  0.0 si,  0.0 st
KiB Mem :  8269412 total,  3161228 free,  4878832 used,   229352 buff/cache
KiB Swap: 15483260 total, 14830144 free,   653116 used.  3256848 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    1 root      20   0    8936    192    148 S   0.0  0.0   0:00.17 init
    8 root      20   0    8936     96     56 S   0.0  0.0   0:00.00 init
    9 shubh     20   0   16916   2748   2640 S   0.0  0.0   0:00.43 bash
   76 root      20   0    8936    224    184 S   0.0  0.0   0:00.00 init
   77 shubh     20   0   16784   3432   3332 S   0.0  0.0   0:00.35 bash
  161 shubh     20   0       0      0      0 Z   0.0  0.0   0:00.00 zombie
  162 shubh     20   0   17624   2084   1508 R   0.0  0.0   0:00.00 top

ここでは、他の詳細とともに、出力の上部にある要約でゾンビプロセスの数も確認できます。

3. ゾンビプロセスのクリーニング

ゾンビプロセスはすでに死んでいるので、実際に殺すことはできません。 ただし、ゾンビプロセスをクリーンアップするために使用できるいくつかの回避策があります。

3.1. SIGCHLD信号の使用

ゾンビプロセスの親にSIGCHLD信号を手動で送信できます。 その結果、親を親密にして wait()システムコールをトリガーし、プロセステーブルからdefunct子プロセスをクリーンアップします。

廃止されたプロセスの親IDを見つけましょう。

$ ps -A -ostat,pid,ppid | grep -e '[zZ]'
Z      108   103

これは、ゾンビプロセスの STAT 列、プロセスID、および親プロセスIDを一覧表示します。 次に、 kill コマンドを使用して、SIGCHLDシグナルを親プロセスに送信しましょう。

kill -s SIGCHLD 103

ただし、 SIGCHLDシグナルを親に送信すると、ゾンビプロセスが強制終了されるとは限りません。 親プロセスがSIGCHLD信号を処理できる場合にのみ機能します。

3.2. 親プロセスを強制終了する

前のセクションで説明した方法で無効なプロセスをクリアできない場合は、その親プロセスを強制終了することを検討する必要があります。

kill -9 103

ここで、 103 は、 PID 108を使用したdefunctプロセスの親IDです。

ただし、親を強制終了すると、そのすべての子プロセスに影響を与える可能性があります。 したがって、親プロセスを強制終了する前に、特に注意を払い、影響を特定する必要があります。

ゾンビプロセスが多数存在する場合、またはゾンビプロセスの親が initプロセス pid = 1)である場合は、システムを再起動して削除することも検討できます。廃止されたプロセスの。

4. 結論

このチュートリアルでは、ゾンビプロセスをクリーンアップする方法を学習しました。

最初に、Linuxのさまざまなプロセス状態について説明しました。 次に、ゾンビプロセスの作成につながる可能性のある状況を調べました。 次に、システム内のゾンビプロセスを見つけるさまざまな方法を見ました。 最後に、問題の解決策について説明しました。