pidofとpgrepの違いは何ですか?

pidofとpgrepの違いは何ですか?

引数をプロセス名として使用して、これらのコマンドを使用すると、すべてがまったく同じ数値を返します。同じコマンドですか?同じことを行う2つの異なるコマンドですか? 1つはもう1つのエイリアスですか?

pidof firefox
pgrep firefox

答え1

これらのプログラムpgrepと手順はpidofまったく同じではありませんが、非常に似ています。たとえば、

$ pidof 'firefox'
5696
$ pgrep '[i]ref'
5696
$ pidof '[i]ref'
$ printf '%s\n' "$?"
1

ご覧のとおり、一致pidofするものはありません[i]ref。これはpidof program、名前付きプログラムに関連するすべてのプロセスIDのリストが返されるためですprogram。一方、pgrep re名前が正規表現に一致するプログラムに関連するすべてのプロセスIDのリストを返しますre

最も基本的な形で見ると、実際には次のようになります。

$ pidof 'program'
$ pgrep '^program$'

別の具体的な例として、以下を考えてみましょう。

$ ps ax | grep '[w]atch'
   12 ?        S      0:04 [watchdog/0]
   15 ?        S      0:04 [watchdog/1]
   33 ?        S<     0:00 [watchdogd]
18451 pts/5    S+     0:02 watch -n600 tail log-file
$ pgrep watch
12
15
33
18451
$ pidof watch
18451

答え2

pgrepFoxは検索に正規表現を使用すると言いますが、whileはpidofそうではありません。

しかし、pgrepより多くのオプションが利用可能です。

  • -u "$UID"現在のユーザーに属しているプロセスのみを一致させることができます。
  • これを使用して、特定のプロセス--parentの子プロセスを見つけることができます。
  • --oldest一致するプロセスを1つ以上選択できます--newest
  • ...そしてマニュアルページにリストされている他のさまざまなもの...

適切なシステムでは、各プロセスがどのパッケージに属するかを見てみましょう。

$ dpkg -S "$(which pidof)"
sysvinit-utils: /bin/pidof

$ dpkg -S "$(which pgrep)"
procps: /usr/bin/pgrep

パックマンシステムでは:

$ pacman -Qo "$(which pidof)"
/usr/bin/pidof is owned by procps-ng 3.3.17-1

$ pacman -Qo "$(which pgrep)"
/usr/bin/pgrep is owned by procps-ng 3.3.17-1

RPMシステムの場合:

$ rpm -qf "$(which pidof)"
... ?

答え3

注:pidof最後のスラッシュ以降のすべての内容を検討できますprogram name

fang@debian:~$ ps -ax | grep k3s | head -n1
    528 ?        Ssl  634:37 /usr/local/bin/k3s server
fang@debian:~$ pgrep k3s
528
fang@debian:~$ pidof k3s
fang@debian:~$ pidof /usr/local/bin/k3s
fang@debian:~$ pidof '/usr/local/bin/k3s server'
528
fang@debian:~$ pidof 'k3s server'
528

アップデート:Stéphane Chazelasが言ったように、pidof実際にマッチどの:

  • Name:フィールドは/proc/pid/status
  • 最初のパラメータ/proc/pid/cmdline
  • 最初のパラメータのデフォルト名/proc/pid/cmdline

ほとんどの場合、各argの後に1つずつなければなりませんNUL。例えば。睡眠:

fang@debian:~$ sleep infinity &
[1] 2076966
fang@debian:~$ pidof sleep
2076966
fang@debian:~$ xxd /proc/2076966/cmdline
00000000: 736c 6565 7000 696e 6669 6e69 7479 00    sleep.infinity.
fang@debian:~$ head -n1 /proc/2076966/status
Name:   sleep

argv[0]スペースが含まれているので少し特別です。

fang@debian:~$ ls -l /usr/local/bin/k3s
-rwxr-xr-x 1 root root 54001664  7月  3 20:16 /usr/local/bin/k3s
fang@debian:~$ head -n1 /proc/528/status
Name:   k3s-server
fang@debian:~$ head -n1 /proc/528/cmdline && echo
/usr/local/bin/k3s server
fang@debian:~$ xxd /proc/528/cmdline 
00000000: 2f75 7372 2f6c 6f63 616c 2f62 696e 2f6b  /usr/local/bin/k
00000010: 3373 2073 6572 7665 7200 0000 0000 0000  3s server.......

要約すると、pidを取得するには、次のようにします。

fang@debian:~$ pgrep k3s-server
528
fang@debian:~$ pidof k3s-server
528
fang@debian:~$ pidof 'k3s server'
528

あなたはできません:

fang@debian:~$ pgrep 'k3s server'

なぜならそれだけ一致するからだ。

  • Name:フィールドは/proc/pid/status
  • (...)(内部部品も同じようですね/proc/pid/stat?)

関連情報