結論として

結論として

私は最近pidofそれを学び、比較しましたpgrep。これを実行している間、pidofFirefoxは複数のPIDを返し、pgrep1つだけを返すことに気づきました。

pgrepマニュアルページを確認してトグルを試みたところ、予想される結果が得られました-f

   -f, --full
          The pattern is normally only matched against the process name.  
          When -f is set, the full command line is used.

psこれで、コマンドのフルパス、「シンプル」コマンド名(フルパスなどbasename)、およびコマンド名全体を区別する方法がわかりましたが、argsプロセス名は聞いたことがありません。

以下の例では、他のすべてのプロセスはサブプロセスである4661ため、Firefoxは複数の処理を利用するためにフォークしたと推測されます。

だからここに質問があります:

  • プロセス名とは何ですか?
  • プロセスでこれを設定する方法と理由は何ですか?

見ているこれら 郵便argv[0]、変更または呼び出しによって実行される場合と実行されない場合があるように見え、デバッグを支援し、どのサブprctl(PR_SET_NAME)プロセスが何をしているかを識別するためにのみ使用されます(時には、ユーザーがプロセスが別のプロセスであると考えるように欺かれます)。

そうですか?それともプロセス名以外の名前ですかargv

$ pidof firefox
5495 5463 5391 5384 5380 5351 5330 5311 5239 5184 4661
$ pgrep firefox
4661
$ pgrep -f firefox
4661
5184
5239
5311
5330
5351
5380
5384
5391
5463
5495
$ pgrep -fl firefox
4661 firefox
5184 Web Content
5239 Web Content
5311 Web Content
5330 Web Content
5351 Web Content
5380 Web Content
5384 Web Content
5391 Web Content
5463 Privileged Cont
5495 WebExtensions
$ 

答え1

ほとんどのexec関数は少なくとも2つの引数を受け取ります。最初のものは実行可能ファイルへのパスで、2番目は引数のリストです。リストは含まれているので、argv[0]プログラマーは常にリストを変更できます。それだけです。bash するのためのexec -a new_name。したがって、argv[0]意図した実行可能ファイルを指している間にプロセスの親を定義できます。

Firefoxは元の質問でプロセス名を次のように変更します。呼ぶ prctl (PR_SET_NAME,...)。によると、prctl(2)スレッド名を設定します。

この属性は、pthread_setname_np(3) に設定し、pthread_getname_np(3) で検索できる属性と同じです。このプロパティには、/proc/self/task/[tid]/comm (proc(5) を参照) からもアクセスできます。ここで、[tid]はgettid(2)から返された呼び出しスレッドのスレッドIDです。

こうやった理由について言えば、パスワード次のようなコメントがあります。

// Update the process name so about:memory's process names are more obvious.

man 5 procここで非常に便利です。の場合、cmdlineプログラムがこれを変更するいくつかの方法を説明し、ファイルを 'このファイルをプロセスが表示したいコマンドラインと考えてください。'。 comm'と定義されるプロセスに関連するコマンド名'そして変更する方法も説明されています。

したがって、「プロセス名の変更」には少なくとも2つの方法があり、各方法は異なる方法で作成して機能しますpidofpgrep

  • この方法は、プロセスの開始時またはその後にプロセスを変更しargv[0]て影響を与えます。argv/proc/PID/cmdline
  • 実際にはprctl (PR_SET_NAME,...)プロセスのメインスレッド名を変更し、/proc/PID/comm両方のスレッドに影響を与えます。/proc/PID/task/PID/comm
argv[0] prctl (PR_SET_NAME,...)
pidof 独創的で新しいもの オリジナルのみ
pgrep オリジナルのみ 新製品のみ
pgrep -f 新製品のみ オリジナルのみ
ps -o comm オリジナル 新しい
ps -o cmd 新しい オリジナル

pidof、、明らかにすべてそこにいるでしょうpstoppgrepprocps-ngプロジェクト。

pidof 調査する実際のバイナリcmdlineへのリンクなので、そのメソッドの元のメソッドと新しいメソッドの/proc/PID/exe両方に対して機能しますargv[0]が、他のメソッドの元のメソッドでのみ機能します。

結論として

pgrepマニュアルページの内容プロセス名はい/proc/PID/comm。これargv[0]は、保存されている名前と必ずしも同じではなく、両方の/proc/PID/cmdline名前がさまざまな方法で独立して変更される可能性があります。

明らかに、この機能の主な用途はデバッグとメンテナンスの容易さです。

関連情報