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

xcz*_*zhh 94 text command-line bash

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

pgrep php5

难道它不应该返回 php5 的进程 id(下面的命令就是这样做的)?:

ps aux | grep php5

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

jll*_*gre 89

ps aux | grep x命令给出的结果比pgrep x本质上“更好”,因为您缺少后者的选项。

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

pgrep -f php5
Run Code Online (Sandbox Code Playgroud)

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

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

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

ps wup $(pgrep -f python)
Run Code Online (Sandbox Code Playgroud)

这比

ps aux | grep python | grep -v grep
Run Code Online (Sandbox Code Playgroud)

或者

ps aux | grep p[y]thon
Run Code Online (Sandbox Code Playgroud)

  • 如果您想查看完整的命令行而不仅仅是 pid,还可以添加 `-a` (`--list-full`) 选项。(旧的 pgrep 没有 `-a`,[在 `-fl` 上做了这个](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=526355#15)。) (4认同)
  • 最初的问题是询问差异,但这实际上为我们这些试图让“pgrep”发挥作用的人提供了解决方案。+1 (2认同)

ish*_*ish 87

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 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

  • “pgrep -l”还将进程截断为 15 个字符,这可能是一个错误,但多年来一直如此 (4认同)
  • 哈,这解释了它,来自注释 #3:*这是因为 procs 的某些过程从 `/proc/<pid>/stat` 中获取命令名称,而不是从 `/proc/<pid>/cmdline `*. 好的,@Thorsen,你赢了喷雾剂,这是一个错误:P (3认同)
  • @xczzhh `pgrep` 不是一个不合理的命令。它运行良好,并且符合设计。问题只是你在运行它时错过了一个选项,你不能为此责怪 `pgrep`。使用`ps aux | grep xxx` 是不可靠的,所以需要黑客从输出中过滤掉 `grep` 本身,并且可能会像`ps aux | 那样给出误报。grep 根`。 (3认同)
  • 好吧,它在启动板中作为 2008 年的上游错误 :) “15 个字符后的 top 和 ps truncate 命令” https://bugs.launchpad.net/ubuntu/+source/procps/+bug/295876 (2认同)