我有一个应用程序正在运行
$ 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