不十分なプログラムや不良を悪く行うことができるプログラム ゾンビプロセス Linuxコンピュータの中に潜んでいます。ゾンビがどのように作成されるか、そしてついにあなたがついにそれらを休むことができる方法を見つけてください。
プロセスの状態がLinuxで機能するのか
Linuxは、もちろん、コンピュータ上で実行されているすべてのアプリケーションとデーモンを追跡する必要があります。これを行う方法の1つは、プロセステーブルを維持することです。これはカーネルメモリの構造のリストです。各プロセスには、このリストにそのエントリがあり、これに関する情報がいくつか含まれています。
各プロセステーブル構造には大きな取引がありません。彼らは保持しています プロセスID 他のいくつかのデータ項目、およびそのプロセスのプロセス制御ブロック(PCB)へのポインタ。
それはLinuxが各プロセスに対して検索または設定する必要がある多くの詳細を保持するPCBです。プロセスが作成され、処理時間がかかり、最後に破棄されたため、PCBも更新されます。
Linux PCBには95以上のフィールドが含まれています。
定義されています
構造として
task_struct.h.
そしてそれは700行以上の長さです。 PCBには、次の種類の情報が含まれています。
- プロセス状態 :状態について説明します。
- プロセス番号 :オペレーティングシステム内のその一意の識別子。
- プログラムカウンター :このプロセスが次にCPUへのアクセスを与えられると、このアドレスを使用して実行する必要があるプロセスの次の命令を見つけます。
- 登録 :このプロセスによって使用されるCPUレジスタのリスト。リストにはアキュムレータ、インデックスレジスタ、およびスタックポインタが含まれている可能性があります。
- ファイルリストを開く :このプロセスに関連付けられているファイル。
- CPUスケジューリング情報 :頻繁に頻繁に、CPU処理時間がこのプロセスに授与される頻度を決定するために使用されます。プロセスの優先順位、スケジューリングキューへのポインタ、およびその他のスケジューリングパラメータをPCBに記録する必要があります。
- メモリ管理情報 :メモリに関する詳細このプロセスは、プロセスメモリの開始アドレスや終了アドレスなど、メモリページへのポインタを使用しています。
- I / Oステータス情報 :プロセスによって使用される任意のインまたは出力装置。
「プロセス状態」は、次のいずれかにすることができます。
- NS: 実行中のプロセスまたは実行可能プロセス。実行を実行するCPUサイクルを受信して実行します。 Runnableプロセスは、CPUスロットを実行して待機する準備ができています。
- NS: 睡眠プロセス。プロセスは、INまたはOUTPUT操作などのアクションが完了するのを待っています。リソースが利用可能になるためのリソース。
- NS: プロセスは無停電睡眠状態にある。ブロックシステムコールを使用していて、システムコールが完了するまで続行できません。 「スリープ」状態とは異なり、この状態のプロセスは、システムコールが完了し、実行がプロセスに戻るまで信号に応答しません。
-
NS:
プロセスは受信されたために終了(停止)
Sigstop.信号。それ 応答するだけです にシグキルまたシグコントシグナル、それはプロセスを強制終了するか、続けるように指示します。これはあなたがスワップしたときに起こっているのです 前景(f) に バックグラウンド (bg)タスク -
Z:
ゾンビプロセス。プロセスが完了すると、それは消えないだけではありません。それはメモリを解放し、それ自体をメモリから削除しますが、プロセステーブルとPCBのエントリは残っています。その状態はに設定されています
exit_zombie.、その親プロセスは(によって)通知されます。シグルド子プロセスが終了したこと)。
ゾンビ状態では、親プロセスはのいずれかを呼び出します。
待つ()
関数の家族
子プロセスが作成されたとき。その後、子プロセスの状態変化を待ちます。児童プロセスが停止し、続く、またはシグナルによって殺されましたか?そのコードの自然完了を通して実行することによって終了しましたか?
子プロセスが実行されていることを意味する状態の変更が実行された場合は、その終了コードが読み込まれます。その後、子PCBが破棄され、プロセステーブルへのエントリが削除されます。理想的には、これはすべて目の点滅で起こり、ゾンビの状態のプロセスは非常に長い間存在しません。
関連している: Linuxでバックグラウンドプロセスを実行して制御する方法
Linuxでゾンビプロセスを原因としますか?
未解決の親プロセスが呼び出されない可能性があります
待つ()
子プロセスが作成されたときの機能。これは、子プロセスの州の変更を見ていないことを意味します。
シグルド
信号は無視されます。あるいは、別のアプリケーションは、プログラミングの低下または悪意のある意図のために、親プロセスの実行に影響を及ぼしています。
ただし、親プロセスが子プロセスの状態変更を監視していない場合は、適切なシステムハウスキーピングが発生しません。子プロセスが終了すると、PCBとプロセステーブルのエントリは削除されません。これにより、ゾンビ状態がPCBから削除されないことになります。
ゾンビは少しメモリを使用していますが、通常は問題を引き起こしません。プロセステーブルのエントリは小さいですが、リリースされるまでプロセスIDを再利用できません。 64ビットオペレーティングシステムでは、PCBがプロセステーブルエントリよりもはるかに大きいため、問題を引き起こす可能性は低いです。
膨大な数のゾンビが、考えられる可能性があると考えられ、他のプロセスのための無料のメモリの量に影響を与える可能性があります。あなたがその多くのゾンビを持っていたならば、あなたは親アプリケーションまたはオペレーティングシステムのバグに深刻な問題を抱えています。
ゾンビプロセスを削除する方法
ゾンビプロセスを殺すことはできません。それはメモリから削除されているので、どんなシグナルにも反応しません - 送信するものはどこにありません
シグキル
信号。送信してみてください
シグルド
親プロセスへのシグナルですが、子プロセスが終了したときにうまくいかなかった場合は、今どちらでも機能することはほとんどありません。
唯一の信頼できるソリューションは、親プロセスを強制終了することです。終了したら、その子プロセスはに継承されます。
初期化
プロセス。Linuxシステムで実行する最初のプロセスである(そのプロセスIDは1)。
NS
初期化
プロセスは定期的にゾンビのクリーンアップを実行し、それらを殺すために、それらを作成したプロセスを殺さなければなりません。 NS
上
コマンドはあなたがゾンビがあるかどうかを見るための便利な方法です。
次のように入力します。
トップ
このシステムには8つのゾンビプロセスがあります。私たち
これらをリストすることができます
を使って
ps
指図
そしてそれを配管する
草食
。繰り返しになりますが、ゾンビプロセスには「z」の状態フラグがあり、通常は「DEFUNCT」も表示されます。
次のように入力します。
PS AUX | EGREP「Z | DEFUNCT
ゾンビプロセスがリストされています。
これはゾンビのプロセスIDを発見するためのきれいな方法よりも前後にスクロールする方法です。
上
。また、「BADPRG」と呼ばれるアプリケーションがこれらのゾンビを生み出したこともわかります。
最初のゾンビのプロセスIDは7641ですが、その親プロセスのプロセスIDを見つける必要があります。私たちは使うことによってそうすることができます
また。出力オプションを使用します。
ps
-
に言う
ps
親のプロセスIDだけを表示してから、
PPID =
国旗。
見つけたいプロセスは、を使用して表示されます。
-NS
(PROCESS)オプション、次にゾンビのプロセスIDを渡します。
したがって、プロセス7641のプロセス情報を検索するには、次のコマンドを入力しますが、親プロセスのIDのみを報告します。
PS -O PPID = -P 7641
親プロセスIDは7636であると言われています。
ps
もう一度。
これが以前から親プロセスの名前と一致するのがわかります。親プロセスを強制終了するには、次のようにkillコマンドでsigkillオプションを使用します。
kill-sigkill 7636
親プロセスの所有者によっては、使用する必要があるかもしれません
sudo.
。
ゾンビは怖くない...
...大勢の大群になっていない限り。心配するものは何もないと単純な再起動が彼らを拭くことにはありません。
ただし、アプリケーションやプロセスが常にゾンビに存在することに気付いた場合、それはあなたが覗くべきことです。それはほとんどの場合、ただのスロップリーで書かれたプログラムです。その場合、おそらくその子プロセスの後に正しくクリーンアップする更新版があります。