sudo pgrep -f 匹配任意字符串并返回递增的 pid

sudo pgrep -f 匹配任意字符串并返回递增的 pid

在调试相关问题时,我注意到 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命令的一部分。

通过使用-land -a(如果你pgrep支持的话),你会得到一个更好的主意。

测试:

% sudo pgrep -af "asdf"
4560 sudo pgrep -af asdf

% sudo pgrep -lf "asdf"
4562 sudo

% pgrep -af "asdf" 
%

答案2

它正在查找您的sudo命令,因为您使用“-f”搜索的字符串也存在于pssudo 的完整列表中。

基本上当你跑步时sudo pgrep -f xyz你就跑步

PID1 sudo pgrep -f xyz
PID2 pgrep -f xyz

pgrep 命令将找到两者,忽略其自身,并将 PID1 报告为匹配。

PID 自然会增加,因为sudo每次运行都会有一个新命令!

相关内容