質問

LinuxでCを使用してプロセスの状態に関する情報(ゾンビの場合)を取得するにはどうすればよいですか

これまでの回答を読んだ後、質問をいくらか絞りたいと思います。純粋なCソリューションを好むでしょう。 psソース(/ proc /を読み取ります)を読んだ後、もっと良い方法があるはずだと思い、ここで尋ねました:)

役に立ちましたか?

解決

/ proc /" psuedo-filesystem"とのやり取りについて学習します。典型的なC標準ライブラリ呼び出しを介して。始めるのに必要なドキュメントは、Linuxディストリビューションに含まれており、簡単なGoogle検索です。

(これで、何を検索すればよいかがわかりました。通常は、これがほとんどの挑戦です!)

要するに、実行中のLinuxシステムの/ proc /ディレクトリ内のディレクトリとファイルは、実行中のカーネルの状態を反映します。これには(当然)プロセスが含まれます。ただし、請求する前に、いくつかの情報を覚えておく必要があります。

ゾンビプロセスは、孤立プロセスとは異なります。孤立プロセスとは、プロセスの親が誤って終了した後、待機状態で実行されたままのプロセスです。ゾンビプロセスは、適切に終了し、すべてのリソースを解放したが、プロセステーブル内の場所を維持しているプロセスです。

これは通常、プログラムによってプロセスが起動されたときに発生します。ご覧のとおり、親プログラムがサブプロセスの戻り状態を適切に取得するまで、カーネルはプロセステーブル内の終了したサブプロセスのエントリを削除しません。それは理にかなっている;サブプロセスが不適切に終了した場合、親プログラムは他にどのように知るのですか?

したがって、すべてのサブプロセスは、少なくとも非常に短い間、技術的にゾンビになります。プログラムが存在するのは本質的に悪い状態ではありません。

確かに、「ゾンビ」意図的に作成されることがあります。たとえば、プログラムによってしばらくゾンビエントリが残ったままになり、それ以降に起動されるプロセスが以前に起動された(現在はゾンビの)プロセスと同じPIDを取得しないことがあります。

つまり、ゾンビプロセスを不必要にSIGCHLDingすると、生成プログラムに重大な問題が発生する可能性があります。ただし、プロセスが30分以上ゾンビになっている場合は、おそらくバグの兆候です。

編集:質問が変わりました!いいえ、psが行うよりも簡単な方法はありません。もしあれば、ずっと前にpsに統合されていたでしょう。 / procファイルは、カーネルの状態に関する情報のすべての情報源です。 :)

他のヒント

2つの方法しか知らない:

  • ps コマンドの出力の解析
  • / proc / PIDのファイルの読み取り。PIDはプロセス識別子です(これは ps が内部的に行うことです)

マシンでプロセスを実行してから使用する

$ ps aux

ps は、アクティブなプロセスの選択に関する情報を表示します。選択と表示される情報を繰り返し更新する場合は、代わりに top を使用します。

こちら

が見つかりました
Use this command to display all of your zombie processes:

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

これはCを使用して簡単に解析できます。

擬似ファイルシステム/ procは、カーネルの内部データ構造を記述しており、いくつかの値を直接変更する機会を提供します。 特定のプロセスの状態の取得は、I / O C関数を使用して簡単に実装できます。解析する正しいファイルは次のとおりです。 / 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top