我使用 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/status
。PID
例如:
$ ./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