pgrepの-fオプションについて説明してください

pgrepの-fオプションについて説明してください

その男はpgrepオプションについて次のように言いました-f

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

完全なコマンドラインを使用するとはどういう意味ですか?

ベストアンサー1

つまり、Withoutはコマンド名で指定された正規表現のみを-f検索しますが、正規表現を使用するとその引数で検索されます(最初の引数()は必ずしもコマンド名と同じではありません)。pgrep-fargv[0]

$ sleep 2000 &
[1] 15768
$ pgrep 2000
$ pgrep -f 2000
15768

'sを使用するときとは異なるコマンド名が表示される場合argv[0](Linuxでは):/proc/$pid/statzshARGV0

$ ARGV0=foo sleep 2000 &
[2] 15881
$ ps -fp $!
UID        PID  PPID  C STIME TTY          TIME CMD
chazelas 15881 13126  0 19:55 pts/1    00:00:00 foo 2000
$ ps -o comm= $!
sleep
$ awk '{print $2}' /proc/$!/stat
(sleep)
$ pgrep foo
$ pgrep sleep
15881
$ pgrep -f sleep
$ pgrep -f foo
15881

UnixとLinuxのプロセス名には多くの潜在的な混乱があります。プロセスには、プロセス名で宣言できる3つの属性があります。

  • プロセスが実行した最後のexecve(2)システムコールに渡された実行可能ファイルのデフォルト名。 Linuxでは、ps報告または検出されたとおりにプロセス名を初期化するために使用されます/proc/$pid/stat。しかし、Linuxではprctl(PR_SET_NAME...)
  • プロセスで現在実行されている実行可能ファイルへのすべてのパスmmap、好ましくは呼び出し時のパス(たとえば、スクリプトの場合はshebang行に指定されたパス)。 Linuxでは、readlinkまたはを使用して取得できます/proc/$pid/exe。つまり、他のものを呼び出さないと変更できません。execve(理論的には、呼び出さずにメモリに新しい実行可能ファイルをロードしてそのコードを実行できますが、たとえばexecveいくつかの試みを参照してください。ユーザー土地の執行)。
  • 最初のパラメータはexecveシステムコールで渡されます。通常、このパラメータはアプリケーションに名前を伝え、それに応じてどのように機能するかを知るためのものであるため、通常はプロセス名が意味します。 Linuxでは見つかりますが、/proc/$pid/cmdlineプロセスが指すメモリを変更してそれを変更することもできますargv[0]

また、さまざまなUnicesには多くの違いがあることに注意してください。

おすすめ記事