
この質問は、ゾンビ プロセスを強制終了する方法に関する別の質問として重複としてマークされているため、編集しています。
私はゾンビ プロセスを強制終了する方法の答えを探しているわけではありません。私のシステムにはゾンビは存在せず、ゾンビがどのように作成されるかは知っています。
質問を言い換えてみましょう。現在、ゾンビを除去する方法として認められているのは以下の方法です。
親に SIGCHLD を送信します。理論的には機能しますが、実際には常に機能するとは限りません。ゾンビが最初に作成された理由の 1 つは、親が SIGCHLD に適切に応答しなかったためである可能性があります。
親プロセスを強制終了します。
- ゾンビを作成したプログラムのバグを修正しました。
- 再起動しています。
または、ここ
または、この編集の前に私の質問に対するコメントで @richard が言及した理由:
..to prevent the pid being reused. The parent has the pid of the child and may signal the child (may try to kill it), just from the pid it recieved when it created the child. It would be bad for the pid to be reused. Therefore the child remains in a zombie state until the parent acknowledges the death of the child, or the parent dies.
私の質問は次のとおりです。
なぜゾンビを一掃するための直接的な方法がないのでしょうか。
ゾンビが信号で殺せたとしたら、どのような副作用や結果が起こったでしょうか。
*NIX の保守担当者がゾンビをクリーンアップするシグナルまたはコマンド (「新しいシグナルを作成する」というフレーズが技術的に受け入れられない場合は申し訳ありません) を作成するのを妨げているものは何でしょうか。
答え1
プロセスは、その時点ですでに終了しています。再度終了しても意味がありません。プロセス テーブルに記録されたままなので、親プロセスがそのステータスを取得できます。
すべてのプロセスは終了するとゾンビになることに注意してください。ほとんどの親プロセスは子プロセスをすぐにクリーンアップするため、ゾンビは見えません。ソフトウェアがゾンビをクリーンアップせず、次の方法でのみクリーンアップされる場合は、バグレポートを提出することをお勧めします。初期化親プロセスが終了すると。
追加の質問は、なぜSIGKILL
プロセステーブルから削除しないのかということです。まず、なぜ削除すべきなのかを教えてください。プロセステーブルから機能していないプロセスをユーザーが削除できるようにする理由は、私にはわかりません。オペレーティングシステムの設計では、常に何かをする良い理由質問する前になぜそれをしないのか実際の使用例がない機能を要求しています。
目的の欠如とは別に、それは悪い結果をもたらすでしょう。親は、終了した子の状態を知るために呼び出したりwait()
、呼び出したりしますwaitpid()
。呼び出しの結果は、プロセスが開始する前に呼び出されたかどうかに関係なく一貫しています。廃止された、 を発行する前SIGKILL
、または を発行した後。
カーネルが記録を保持しない場合(つまり、プロセスがプロセステーブルから削除される場合)、動作は一貫性がなくなり、親プロセスは一貫性のなさを予期し、正当な理由もなくそれに対処する必要があります。古いプロセスを再利用するシステムでは、ピッド値を記録すると、ソフトウェアが誤ってまったく別のプロセスを強制終了するなど、さらに深刻な問題が発生する可能性があります。