问题描述
我刚刚在我的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