为什么“ ps aux | grep x”比“ pgrep x”提供更好的结果?


82

我刚刚在Ubuntu上尝试了以下命令,但没有显示任何内容:

pgrep php5

它不应该返回php5的进程ID(以下命令刚刚执行的操作)吗?:

ps aux | grep php5

那么,这两个命令有什么区别?

Answers:


75

ps aux包括完整的命令行(路径和参数),而pgrep只查看可执行文件名称的前15个字符

ps aux返回每个进程的完整命令行,而pgrep仅查看可执行文件的名称。

这意味着grepping ps aux输出将匹配在路径或进程的二进制参数中出现的所有内容:

  • ps aux | grep php5 将匹配 /usr/share/php5/i-am-a-perl-script.pl
  • pgrep php5不会

以我的系统为例-只有我们将使用python代替php5

  • ps aux | grep python 给我们:
izx 2348 0.0 0.7 514928 15644吗?Sl Jun24 0:00 / usr / bin / python / usr / lib / unity-lens-video / unity-lens-video
izx 2444 0.0 0.9 0.9 547392 18864吗?Sl Jun24 0:01 / usr / bin / python / usr / lib / unity-scope-video-remote / unity-scope-video-remote
根2805 0.0 0.5 95436 12204 S Jun24 0:00 / usr / bin / python / usr / lib / system-service / system-service-d
izx 6272 0.0 2.9 664400 60320?SNl Jun24 1:16 / usr / bin / python / usr / bin / update-manager --no-focus-on-map
根11729 0.0 0.9 180508 19516?S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus
  • 但是pgrep python仅返回11729,您将从上面的列表中看到:
根11729 0.0 0.9 180508 19516?S Jun25 0:00 python / usr / lib / software-properties / software-properties-dbus

3
“ pgrep -l”也将过程截断为15个字符,这可能是一个错误,但是多年来一直是这样
Thorsen 2012年

1
好吧,它在启动板中是截至2008年的上游错误:)“ top和ps在15个字符后截断命令” bugs.launchpad.net/ubuntu/+source/procps/+bug/295876
Thorsen

2
哈,这是从注释3解释的:这是由于proc的某些过程从而/proc/<pid>/stat不是从获取命令名称的事实/proc/<pid>/cmdline。好吧,@ Thorsen,您赢得了错误喷剂,这是一个错误:P
ish

2
@xczzhh pgrep不是一个不合理的命令。它运作良好且符合设计要求。问题很简单,您在运行该选项时就错过了一个选项,您不能pgrep为此负责。使用ps aux | grep xxx是不可靠的,因此需要黑客来grep从输出中过滤掉自身,并可能产生与一样的误报ps aux | grep root
jlliagre 2013年

1
这应该是在禁毒广告中,bash工具的创建者对LSD如此着迷,以为这样的事情设计得很好
Andy Ray

78

ps aux | grep x命令提供的结果“更好”,而不是pgrep x本质上是因为您缺少后者的选项。

只需使用该-f选项pgrep即可搜索完整的命令行,而不仅是其默认行为的进程名称,例如:

pgrep -f php5

ps | grep您需要过滤掉grep线条或使用图案技巧的构造不同,pgrep只是不会因设计而自行选择。

而且,如果您的模式出现在ps USER列中,您将在输出中得到不需要的进程,而pgrep不会受到此缺陷的影响。

如果您想要完整的细节而不是仅pid,可以使用:

ps wup $(pgrep -f python)

比起它更简单,更可靠

ps aux | grep python | grep -v grep

要么

ps aux | grep p[y]thon

3
如果要查看完整的命令行而不只是pid,还请添加-a--list-full)选项。(较早的pgrep则没有-a,执行此操作-fl。)
Beni Cherniavsky-Paskin 2014年

1
最初的问题是询问差异,但这实际上使我们当中的那些人试图更好pgrep地解决问题。+1
2rs2ts 2015年

@ 2rs2ts谢谢,我确实很想回答所提出的问题。立即修复。
jlliagre

在某些情况下,当程序修改/proc/self/cmdline为“描述性”时,pgrep -fa ruby例如将不匹配。puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker],而“哑巴” pgrep -a ruby会。不知道后者是否也可能被愚弄。
贝尼·切尔尼亚夫斯基-帕斯金

@ BeniCherniavsky-Paskin我想这可能是对该问题的评论,因为它同时适用于pgrepps
富兰克林·于

3
diff <(ps aux|grep x) <(pgrep x) # :)

12
这可能会回答问题的答案-但也许您可以扩展答案以解释这一行命令的作用。
fossfreedom

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.