我刚刚在我的 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
)