Answers:
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 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
/proc/<pid>/stat
不是从获取命令名称的事实/proc/<pid>/cmdline
。好吧,@ Thorsen,您赢得了错误喷剂,这是一个错误:P
pgrep
不是一个不合理的命令。它运作良好且符合设计要求。问题很简单,您在运行该选项时就错过了一个选项,您不能pgrep
为此负责。使用ps aux | grep xxx
是不可靠的,因此需要黑客来grep
从输出中过滤掉自身,并可能产生与一样的误报ps aux | grep root
。
该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
pgrep
地解决问题。+1
/proc/self/cmdline
为“描述性”时,pgrep -fa ruby
例如将不匹配。puma 3.3.0 (tcp://localhost:3000) [MIQ: Web Server Worker]
,而“哑巴” pgrep -a ruby
会。不知道后者是否也可能被愚弄。
pgrep
和ps
。
此时,ps
将给出比pgep -f
pgrep限于前4,096个字符的完整输出(通常会影响正在寻找具有长类路径的Java程序的入口类的Java用户)。跟踪此错误的错误是:https : //gitlab.com/procps-ng/procps/issues/86