引数をプロセス名として使用して、これらのコマンドを使用すると、すべてがまったく同じ数値を返します。同じコマンドですか?同じことを行う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
pgrep
Foxは検索に正規表現を使用すると言いますが、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
?)