Linuxゾンビプロセスをクリーンアップする方法
1. 概要
このチュートリアルでは、ゾンビプロセスとそれらをクリーンアップする方法について学習します。 まず、さまざまなプロセス状態を理解します。 次に、ゾンビプロセスを特定する方法を確認します。 最後に、問題の解決策に到達します。
2. ゾンビプロセスとは
Linuxのゾンビプロセスは、無効またはデッドプロセスとも呼ばれます。 それらは実行を完了したプロセスですが、それらのエントリはプロセステーブルから削除されません。
2.1. プロセス状態
Linuxは、実行中のすべてのプロセスのプロセステーブルとその状態を維持します。 さまざまなプロセス状態の概要を簡単に説明します。
- 実行中(R):これらのプロセスは現在実行中または実行可能です。
- 待機中(S / D):これらはイベントまたはリソースを待機しているプロセスです。 待機は、中断可能なスリープ(S)または中断不可能なスリープ(D)のいずれかです。
- 停止(T):適切なシグナルを送信することでLinuxプロセスを停止できます。
- ゾンビ(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 列またはゾンビまた
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のさまざまなプロセス状態について説明しました。 次に、ゾンビプロセスの作成につながる可能性のある状況を調べました。 次に、システム内のゾンビプロセスを見つけるさまざまな方法を見ました。 最後に、問題の解決策について説明しました。