LinuxでCを使用して、プロセスの状態(つまり、ゾンビの場合)に関する情報を取得するにはどうすればよいですか?
これまでの回答を読んだ後、質問をいくらか絞り込みたいと思います。純粋なCソリューションを好むでしょう。psソース(/ proc /を読み取る)を読んだ後、もっと良い方法があるはずだと思い、ここで尋ねました:)
LinuxでCを使用して、プロセスの状態(つまり、ゾンビの場合)に関する情報を取得するにはどうすればよいですか?
これまでの回答を読んだ後、質問をいくらか絞り込みたいと思います。純粋なCソリューションを好むでしょう。psソース(/ proc /を読み取る)を読んだ後、もっと良い方法があるはずだと思い、ここで尋ねました:)
典型的なC標準ライブラリ呼び出しを介した/proc/"psuedo-filesystem"との対話について学びたいと思うでしょう。開始するために必要なドキュメントは、Linuxディストリビューションに含まれており、グーグルで簡単に検索できます。
(これで、何を検索するかがわかりました。これが通常、ほとんどの課題であることを私は知っています!)
つまり、実行中のLinuxシステムの/ proc /ディレクトリ内のディレクトリとファイルは、(当然のことながら)プロセスを含む実行中のカーネルの状態を反映しています。ただし、請求する前に、いくつかの情報を覚えておく必要があります。
ゾンビプロセスは、孤立したプロセスと同じではありません。孤立したプロセスとは、プロセスの親が誤って終了した後、待機状態で実行されたままのプロセスです。ゾンビプロセスは、適切に終了し、すべてのリソースを解放したが、プロセステーブル内の場所を維持しているプロセスです。
これは通常、プロセスがプログラムによって起動されたときに発生します。ご覧のとおり、親プログラムがサブプロセスの戻りステータスを適切にフェッチするまで、カーネルはプロセステーブルの終了したサブプロセスのエントリを削除しません。それは理にかなっている; サブプロセスが不適切に終了したかどうかを親プログラムは他にどのように知ることができますか?
したがって、すべてのサブプロセスは、少なくとも非常に短い間、技術的にはゾンビです。プログラムが存在することは本質的に悪い状態ではありません。
実際、「ゾンビ」は意図的に作成されることがあります。たとえば、ゾンビエントリがプログラムによってしばらくそのまま残されることがあるため、さらに起動されたプロセスは、以前に起動された(現在はゾンビ)プロセスと同じPIDを取得しません。
つまり、ゾンビプロセスを不必要にSIGCHLDする場合、スポーンプログラムに深刻な問題が発生する可能性があります。ただし、プロセスが30分以上ゾンビであった場合は、おそらくバグの兆候です。
編集:質問は私に変わりました!いいえ、psが行う方法よりも簡単な方法はありません。もしあれば、それはずっと前にpsに統合されていたでしょう。/ procファイルは、カーネルの状態に関する情報のすべてを網羅したソースです。:)
マシンで実行されているプロセスが必要な場合は、
$ ps aux
psは、アクティブなプロセスの選択に関する情報を表示します。選択範囲と表示される情報を繰り返し更新する場合は、代わりにtopを使用してください。
私は2つの方法しか知りません:
psコマンドの出力を解析するpsは内部で行われます) 。疑似ファイル システム /proc は、カーネルの内部データ構造を記述しており、一部の値を直接変更する機会を提供します。特定のプロセスの状態を取得することは、I/OC 関数を使用して簡単に実装できます。解析する正しいファイルは次のとおりです: /proc/{PID}/status
以下のコマンドを使用して、ゾンビ状態のプロセスを取得できます。
for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done
ここで見つかりました:
Use this command to display all of your zombie processes:
ps aux | awk '{ print $8 " " $2 }' | grep -w Z
これは、Cを使用して簡単に解析できます。