pgrep 完全匹配不起作用,只能部分匹配,为什么?

pgrep 完全匹配不起作用,只能部分匹配,为什么?

我使用 procps-3.3.10 中的 pgrep。

如果我有可执行文件aout_abcdefgh_ver27,那么

pgrep aout_abcdefgh_ver27

不返回任何内容,而ps aux | grep aout_abcdefgh_ver27返回预期结果:

ps aux | grep aout_abcdefgh_ver27 
evgeniy  14806  0.0  0.0   4016   672 pts/8    S    12:50   0:00 ./aout_abcdefgh_ver27
evgeniy  15241  0.0  0.0  12596  2264 pts/8    S+   12:50   0:00 grep --colour=auto aout_abcdefgh_ver27

但如果我跑

$ pgrep aout_abcdefgh_v
14806

pgrep返回我所期望的,所以我想知道为什么它以如此奇怪的方式工作,也许我应该使用一些选项来pgrep处理完整的进程名称?

看起来它对模式的限制非常短,大​​约 10 个符号。

答案1

问题是默认情况下pgrep只搜索进程姓名。该名称是整个命令的截断版本。通过查看相关进程的进程 ID就可以知道名称是什么/proc/PID/statusPID例如:

$ ./aout_abcdefgh_ver27 &
[1] 14255                    ## this is the PID
$ grep Name /proc/14255/status
Name:   aout_abcdefgh_v

所以是的,pgrep没有标志时仅读取可执行文件名称的前 15 个字符。要搜索用于启动它的完整命令行,您需要该-f标志(来自man pgrep):

-f, --full
     The pattern is normally only matched against the process name.  
     When -f is set, the full command line is used.

所以,如果你使用-f

$ pgrep -f aout_abcdefgh_ver27 
14255

相关内容