Ps

pgrep 完全匹配不起作用,只有部分,為什麼?

  • March 2, 2016

我使用 procps-3.3.10 中的 pgrep。

如果我有執行檔aout_abcdefgh_ver27,那麼

pgrep aout_abcdefgh_ver27

什麼都不返回,而ps aux | grep aout_abcdefgh_ver27返回預期的結果:

ps aux | grep aout_abcdefgh_ver27 
evgeniy  14806  0.0  0.0   4016   672 pts/8    S    12:50   0:00 ./aout_abcdefgh_ver27
evgeniy  15241  0.0  0.0  12596  2264 pts/8    S+   12:50   0:00 grep --colour=auto aout_abcdefgh_ver27

但如果我跑

$ pgrep aout_abcdefgh_v
14806

pgrep返回我所期望的,所以我想知道為什麼它以如此奇怪的方式工作,也許我應該使用一些選項pgrep來使用完整的程序名稱?

看起來它對模式的限制非常短,大​​約 10 個符號。

問題是預設情況下,pgrep只搜尋程序名稱。該名稱是整個命令的截斷版本。您可以通過查看相關程序的程序 ID在/proc/PID/status哪裡來查看名稱。PID例如:

$ ./aout_abcdefgh_ver27 &
[1] 14255                    ## this is the PID
$ grep Name /proc/14255/status
Name:   aout_abcdefgh_v

所以是的,pgrep沒有標誌只讀取執行檔名稱的前 15 個字元。要搜尋用於啟動它的完整命令行,您需要-f標誌(來自man pgrep):

-f, --full
    The pattern is normally only matched against the process name.  
    When -f is set, the full command line is used.

所以,如果你使用-f

$ pgrep -f aout_abcdefgh_ver27 
14255

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