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

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

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

pgrep php5

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

ps aux | grep php5

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

答案1

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

答案2

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 6月24日 0:00 /usr/bin/Python/usr/lib/unity-镜头视频/unity-镜头视频
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 6月24日 0:00 /usr/bin/Python/usr/lib/系统服务/系统服务-d
izx 6272 0.0 2.9 664400 60320 ? SNl 6月24日 1:16 /usr/bin/Python/usr/bin/update-manager --no-focus-on-map
根 11729 0.0 0.9 180508 19516 ? S 6月25日 0:00Python/usr/lib/软件属性/软件属性-dbus
  • pgrep python仅返回11729,您将从上面的列表中看到:
根 11729 0.0 0.9 180508 19516 ? S 6月25日 0:00Python/usr/lib/软件属性/软件属性-dbus

答案3

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

答案4

这可能不会更好...当我尝试寻找 tmux 服务器进程时,

pgrep -l tmux

展示了它,但是

ps aux | grep tmux 

不会将其显示为服务器,但显示为触发服务器启动的命令。(tmux new -s foo

相关内容