プロセスがシステムプロセスであるかどうかを確認するには?

プロセスがシステムプロセスであるかどうかを確認するには?

/procすべてのプロセスを見つけるためにディレクトリ(または疑似ファイルシステム)を読み込んでいます。私はそれから必要な情報を取得していますが、/proc/[pid]/status別のものが必要です。どのプロセスがシステムにとって重要であるかを理解する方法はありますか?たとえば、プロセスの親pidまたはUIDを使用しますか?

システムプロセスとは、オペレーティングシステムの新規インストールとアプリケーションまたはサービスのインストール前に存在するプロセスを意味します。これはカーネルスレッドやシステムプロセスをまったく意味しないかもしれませんが、要約すると、プロセス、プロセス終了、会議システムの基本構造を破壊します。

PS。 Androidアプリを開発していますが、この部分は純粋なLinuxファイルシステムを使用して進行しているので、ここに質問をしたところ、あまり違いはないようです。

答え1

その場合は、+を押してカーネルスレッドの表示を切り替えるhtopことができます。ツリーモードを押すと、すべての子として表示されます。ShiftkF5kthreadd

そこはいカーネルスレッドとユーザー空間スレッドのいくつかの注目すべき違いは次のとおりです。

  • /proc/$pid/cmdlineカーネルスレッドの場合、NULL - psとtopがカーネルスレッドを区別する方法です。

  • シンボリック/proc/$pid/exeリンクにカーネルスレッドのターゲットはありません。これは、ファイルシステムに対応する実行ファイルがないため意味があります。

具体的には、readlink()ENOENTリンク自体は存在しますが、システムコールは「対応するファイルやディレクトリがありません」を返し、プロセスの実行可能ファイルが存在しないことを示します。

したがって、カーネルスレッドを確認する信頼できる方法は、対応する戻りコードを呼び出して確認することreadlink()です。成功するとユーザープロセス/proc/$pid/exeです。$pid失敗して表示された場合は、アドインを介してカーネルスレッドとENOENT終了したばかりのプロセスを区別する必要があります。stat()/proc/$pid/exe

  • /proc/$pid/statusほとんどのカーネルスレッドには、いくつかのフィールド、特に仮想メモリに関連するいくつかのフィールドがありません。

上記の回答は次のようになります。カーネルスレッドの識別

カーネルスレッドを他のプロセスと区別する別の方法はtop -ctopマニュアルから:

3. コマンド - コマンド名またはコマンドライン
ジョブの開始に使用されるコマンドラインまたは関連プログラムの名前を表示します。コマンドラインオプションとインタラクティブコマンド「c」を使用して、コマンドラインと名前を切り替えることができます。

コマンドラインを表示を選択すると、コマンドラインのないプロセス(カーネルスレッドなど)は、次の例に示すように、括弧内にプログラム名のみを表示します。
[ mdrecoveryd ]

実行中は、ps aux角かっこ内にコマンドなしで開始されたプロセスも表示されます(そして空の/proc/[pid]/cmdlineファイルが表示されます)。

例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root        19  0.0  0.0      0     0 ?        S<   Mar02   0:00 [kworker/1:0H] 

包装ビューprocps-3.2.8文書/proc/readproc.h

// Basic data structure which holds all information we can get about a process.
// (unless otherwise specified, fields are read from /proc/#/stat)
//
// Most of it comes from task_struct in linux/sched.h

答え2

あなたはできません。 「システムプロセス」は明確に定義された概念ではありません。 「システムにとって重要」は、普遍的な例またはいいえ属性ではありません。

私はこの記事をデスクトップコンピュータとして書いています。 Apacheをインストールしますが、このシステムでは「システムにとって重要」ではありません。私は時々テストにのみ使用します。一方、ApacheはパブリックまたはエンタープライズWebサーバーに不可欠です。これとは対照的に、Xサーバーはほとんどのサーバーでは重要ではありませんが、ワークステーションでは不可欠です。

近道はありません。プロセスの終了で問題が発生したかどうかを知りたい場合は、あなたは理解する必要がありますプロセスが実行するアクションです。プロセスが何をしているのかわからない場合は、そのプロセスが重要であるとします。

「オペレーティングシステムの新規インストール中およびアプリケーションまたはサービスがインストールされる前に存在するプロセス」も、明確に定義された概念ではありません。サービスがデフォルトのインストール(Apacheなど)の一部ではない場合でも、特定のシステムにとって重要な場合があります。逆に、サービスは基本インストールに含めることができますが、特定のシステムには重要ではありません(たとえば、ネットワーク接続がないシステムのネットワーク管理サービス)。

Linuxシステム以外(Linuxカーネルを使用する他のシステム)Androidでは、/system「システムプロセス」で実行されているすべてを呼び出すことができます。 Unixとは異なり、この定義はAndroidがデフォルトのシステムをユーザーがインストールしたアプリケーションからはっきりと分離するため、意味があります。基本システムには、事前にインストールされたアプリケーション(電話、Gmailなど)が含まれており、電話プロバイダ(メーカーまたはネットワーク事業者)によってオプションが異なります。この定義のバリエーションは/data実行中ですが、エントリを持つアプリケーションもこの定義によると、アップグレードされた/system/app「システム」アプリケーションです。

答え3

はい、/proc/[pid]/status に UID エントリがあります。入力が次の場合:

UID:    0    0    0    0
UID: real UID, effective UID, saved set UID, file system UID

これは、プロセスがルートに属していることを意味します。

また、ほとんどのルートプロセスには0〜2の範囲の親プロセスpid(PPid)があります。

関連情報