当前位置: 首页>>技术问答>>正文


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

, , ,

问题描述

我刚刚在我的Ubuntu上尝试了以下命令,它没有显示任何事情:

pgrep php5

不应该返回php5的进程ID(下面的命令就是这样做的)?

ps aux | grep php5

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

最佳解决办法

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

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

这意味着,清除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 547392 18864 ?        Sl   Jun24   0:01 /usr/bin/python /usr/lib/unity-scope-video-remote/unity-scope-video-remote
root      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
root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus
  • 但是pgrep python只返回11729,您会从上面的列表中看到:

root     11729  0.0  0.9 180508 19516 ?        S    Jun25   0:00 python /usr/lib/software-properties/software-properties-dbus

次佳解决办法

ps aux | grep x命令给出的”better”结果比pgrep x的结果要重要得多,因为您错过了后者的选项。

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

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/997.html,未经允许,请勿转载。