pidof 和 pgrep 有什么区别?

Gal*_*axy 16 process

当我使用这些命令中的任何一个将参数作为进程名称时,它们都返回完全相同的数字。它们是相同的命令吗?它们是执行相同操作的两个不同命令吗?其中一个是另一个的别名吗?

pidof firefox
pgrep firefox
Run Code Online (Sandbox Code Playgroud)

Fox*_*Fox 23

程序pgrep和程序pidof并不完全相同,但它们非常相似。例如:

$ pidof 'firefox'
5696
$ pgrep '[i]ref'
5696
$ pidof '[i]ref'
$ printf '%s\n' "$?"
1
Run Code Online (Sandbox Code Playgroud)

如您所见,pidof未能找到[i]ref. 这是因为pidof program返回与名为 的程序关联的所有进程 ID 的列表program。另一方面,pgrep re返回与名称与正则表达式匹配的程序关联的所有进程 ID 的列表re

在最基本的形式中,等价实际上是:

$ pidof 'program'
$ pgrep '^program$'
Run Code Online (Sandbox Code Playgroud)

作为另一个具体示例,请考虑:

$ 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
Run Code Online (Sandbox Code Playgroud)


joe*_*dle 6

Fox 提到pgrep使用正则表达式进行搜索,而pidof没有提到。

pgrep也有更多的选择可用:

  • 有了-u "$UID"可以搭配属于当前用户只流程。
  • 使用--parent您可以找到给定进程的子进程。
  • 您可以选择匹配进程中的--oldest--newest
  • ...以及手册页上列出的各种其他内容...

让我们找出每个进程属于哪个包(在 apt 系统上):

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

$ dpkg -S "$(which pgrep)"
procps: /usr/bin/pgrep
Run Code Online (Sandbox Code Playgroud)