pidof和pgrep有什么区别?


13

当我将这两个命令中的任何一个与参数一起用作进程名称时,它们都返回完全相同的数字。它们是相同的命令吗?他们是两个不同的命令来做同一件事吗?其中一个是另一个的别名吗?

pidof firefox
pgrep firefox

Answers:


18

程序pgreppidof不是完全相同的东西,但是它们非常相似。例如:

$ 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

4

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.