什么情况下 pgrep -x 无法返回有效的 pid?

什么情况下 pgrep -x 无法返回有效的 pid?

我有一个应用程序正在运行

$ ps -ef | grep hello_world
steve     9607  1816  0 09:11 ?        00:00:00 ./hello_world
steve    10093 21566  0 09:18 pts/4    00:00:00 grep hello_world

我可以pgrep -f使用模式来搜索 pid

$ pgrep -f ./hello_world
9607
$ echo $?
0

$ pgrep -f hello_world
9607
$ echo $?
0

但是,如果我用来pgrep -x搜索精确的模式匹配,它不返回任何内容

$ pgrep -x ./hello_world
$ echo $?
1

$ pgrep -x hello_world
$ echo $?
1

检查文件系统/proc中的确切命令行,它返回以下内容:

$ cat /proc/9607/cmdline
./hello_world

为什么pgrep -x我会失败?

答案1

$ pgrep -x ./hello_world
$ echo $?
1

第一个表达式不匹配的原因是您要求pgrep查找精确的进程名称匹配(进程名称hello_world在您的示例中),但您提供了./hello_world搜索字符串。

$ pgrep -x hello_world
$ echo $?
1

为什么第二次搜索对你不起作用,我不知道。它适用于 Ubuntu 14.04,因此您的帖子中存在某种错误,或者较新版本中存在错误:

$ ./dd &
[1] 6377
$ pgrep -x dd
6377

答案2

看来 procps 的实现pgrep -x和正则表达式匹配已损坏:

$ /bin/sleep 9& pgrep -x 'sleep'
[1] 8472
8472
$ /bin/sleep 9& pgrep '^sleep$'
[2] 8485
8472
8485
$ 

根据我对手册页的阅读,这两个都应该返回 null。

考虑pidof一下。


有一种恼人的情况,人们想要排除包装脚本,在这种情况下称为sleep

#!//bin////bash
echo "Script PID: $$"
/bin/sleep 1&
pgrep -ax sleep

输出是:

Script PID: 12973                              
12973 //bin////bash ./sleep                    
12974 /bin/sleep 1 

相关内容