fgh*_*ghj 13 ps process-management
我使用 procps-3.3.10 中的 pgrep。
如果我有可执行文件aout_abcdefgh_ver27
,那么
pgrep aout_abcdefgh_ver27
Run Code Online (Sandbox Code Playgroud)
不返回任何内容,而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
Run Code Online (Sandbox Code Playgroud)
但如果我跑
$ pgrep aout_abcdefgh_v
14806
Run Code Online (Sandbox Code Playgroud)
pgrep
返回我期望的结果,所以我想知道为什么它以如此奇怪的方式工作,也许我应该使用一些选项pgrep
来处理完整的进程名称?
看起来它的模式限制很短,大约 10 个符号。
ter*_*don 22
问题是默认情况下,pgrep
只搜索进程名称。该名称是整个命令的截断版本。您可以通过查看相关进程的进程 ID在/proc/PID/status
哪里PID
来了解名称是什么。例如:
$ ./aout_abcdefgh_ver27 &
[1] 14255 ## this is the PID
$ grep Name /proc/14255/status
Name: aout_abcdefgh_v
Run Code Online (Sandbox Code Playgroud)
所以是的,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.
Run Code Online (Sandbox Code Playgroud)
所以,如果你使用-f
:
$ pgrep -f aout_abcdefgh_ver27
14255
Run Code Online (Sandbox Code Playgroud)