Linux

sudo pgrep -f 匹配任意字元串並返回遞增的 pid

  • September 21, 2016

在調試相關問題時,我注意到 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 上嘗試類似的實驗時,測試結果是否定的——沒有神秘的過程。

這裡發生了什麼?

它顯示了sudo程序,即 PID 是程序的 PID,sudo它是您正在執行的命令的父程序,pgrep通過放置 after sudo。當您在整個命令行 (by -f) 中搜尋時,該sudo過程會在輸出中彈出,因為字元串(模式)也是原始sudo命令的一部分。

通過使用-land -a(如果你pgrep支持的話),你會得到一個更好的主意。

測試:

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

% sudo pgrep -lf "asdf"
4562 sudo

% pgrep -af "asdf" 
%

引用自:https://unix.stackexchange.com/questions/311417