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