Linux
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 上嘗試類似的實驗時,測試結果是否定的——沒有神秘的過程。
這裡發生了什麼?
它顯示了
sudo
程序,即 PID 是程序的 PID,sudo
它是您正在執行的命令的父程序,pgrep
通過放置 aftersudo
。當您在整個命令行 (by-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" %