私は最近pidof
それを学び、比較しましたpgrep
。これを実行している間、pidof
Firefoxは複数のPIDを返し、pgrep
1つだけを返すことに気づきました。
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つの方法があり、各方法は異なる方法で作成して機能しますpidof
。pgrep
- この方法は、プロセスの開始時またはその後にプロセスを変更し
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
、、明らかにすべてそこにいるでしょうps
。top
pgrep
procps-ngプロジェクト。
pidof
調査する実際のバイナリcmdline
へのリンクなので、そのメソッドの元のメソッドと新しいメソッドの/proc/PID/exe
両方に対して機能しますargv[0]
が、他のメソッドの元のメソッドでのみ機能します。
結論として
pgrep
マニュアルページの内容プロセス名はい/proc/PID/comm
。これargv[0]
は、保存されている名前と必ずしも同じではなく、両方の/proc/PID/cmdline
名前がさまざまな方法で独立して変更される可能性があります。
明らかに、この機能の主な用途はデバッグとメンテナンスの容易さです。