![sudo pgrep -f 匹配任意字符串并返回递增的 pid](https://linux22.com/image/94875/sudo%20pgrep%20-f%20%E5%8C%B9%E9%85%8D%E4%BB%BB%E6%84%8F%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%B9%B6%E8%BF%94%E5%9B%9E%E9%80%92%E5%A2%9E%E7%9A%84%20pid.png)
在调试相关问题时,我注意到 pgrep 正在为看似任意的命令行模式返回 PID,例如:
$ sudo pgrep -f "asdf"
13017
$ sudo pgrep -f ";lkj"
13023
$ sudo pgrep -f "qwer"
13035
$ sudo pgrep -f "poiu"
13046
$ sudo pgrep -f "blahblahblah"
14038
$ sudo pgrep -f "$(pwgen 16 1)"
14219
没有 sudo 的相同命令没有返回任何内容(如预期):
$ pgrep -f blahblahblah
我尝试将 PID 通过管道传输到 ps 以查看命令是什么,但这不起作用:
$ sudo pgrep -f blahblahblah | xargs ps -f -p
UID PID PPID C STIME TTY TIME CMD
看起来进程终止得太快了。然后我尝试使用 ps 和 grep,但这也不起作用(即没有结果):
$ sudo ps -e -f | grep [a]sdf
$ sudo ps -e -o command | grep asdf
grep asdf
我还注意到,如果我足够快地重新运行命令,那么 PID 似乎会稳步上升:
$ for i in $(seq 1 10); do sudo pgrep -f $(pwgen 4 1); done
14072
14075
14078
14081
14084
14087
14090
14093
14096
14099
$ for i in $(seq 1 10); do sudo pgrep -f blahblahblah; done
13071
13073
13075
13077
13079
13081
13083
13085
13087
13089
作为健全性检查,我尝试使用 find 和 grep 搜索 proc 目录:
$ sudo find /proc/ -regex '/proc/[0-9]+/cmdline' -exec grep adsfasdf {} \;
Binary file /proc/14113/cmdline matches
Binary file /proc/14114/cmdline matches
$ sudo find /proc/ -regex '/proc/[0-9]+/cmdline' -exec grep adsfasdf {} \;
Binary file /proc/14735/cmdline matches
Binary file /proc/14736/cmdline matches
PID 似乎再次攀升,并且 cmdline 匹配任意字符串。
我在 CentOS 6.7 和 Ubuntu 12.04 上进行了尝试,得到了相同的结果。当我在 Mac 上尝试类似的实验时,测试结果为阴性——没有神秘的过程。
这里发生了什么?
答案1
它显示了sudo
进程,即 PID 是您正在运行的命令sudo
的父进程的 PID pgrep
,在sudo
.当您在整个命令行中搜索时(通过-f
),该sudo
过程会在输出中弹出,因为字符串(模式)也是原始sudo
命令的一部分。
通过使用-l
and -a
(如果你pgrep
支持的话),你会得到一个更好的主意。
测试:
% sudo pgrep -af "asdf"
4560 sudo pgrep -af asdf
% sudo pgrep -lf "asdf"
4562 sudo
% pgrep -af "asdf"
%
答案2
它正在查找您的sudo
命令,因为您使用“-f”搜索的字符串也存在于ps
sudo 的完整列表中。
基本上当你跑步时sudo pgrep -f xyz
你就跑步
PID1 sudo pgrep -f xyz
PID2 pgrep -f xyz
pgrep 命令将找到两者,忽略其自身,并将 PID1 报告为匹配。
PID 自然会增加,因为sudo
每次运行都会有一个新命令!