Command-Line
請解釋 pgrep 中的 -f 選項
man對選項
pgrep
說以下內容:-f
-f The pattern is normally only matched against the process name. When -f is set, the full command line is used.
說使用完整的命令行是什麼意思?
這意味著沒有
-f
,pgrep
僅在命令名稱中搜尋提供的正則表達式,而-f
在其參數中搜尋它(其中第一個參數 (argv[0]
) 不一定與命令名稱相同)。$ sleep 2000 & [1] 15768 $ pgrep 2000 $ pgrep -f 2000 15768
如果我們導致與使用’s時
argv[0]
的命令名稱不同(在 Linux 上,如 中所示) :/proc/$pid/stat``zsh``ARGV0
$ ARGV0=foo sleep 2000 & [2] 15881 $ ps -fp $! UID PID PPID C STIME TTY TIME CMD chazelas 15881 13126 0 19:55 pts/1 00:00:00 foo 2000 $ ps -o comm= $! sleep $ awk '{print $2}' /proc/$!/stat (sleep) $ pgrep foo $ pgrep sleep 15881 $ pgrep -f sleep $ pgrep -f foo 15881
關於 Unix 和 Linux 上的程序名稱有很多潛在的混淆。程序的 3 個屬性可以聲稱是程序名稱:
- 傳遞給程序執行的最後一個 execve(2) 系統呼叫的執行檔的基本名稱。在 Linux 上,用於初始化程序名稱,
ps
如/proc/$pid/stat
. 但是,應該注意的是,在 Linux 上,可以使用prctl(PR_SET_NAME...)
.- 目前
mmap
在程序中執行的執行檔的任何路徑,最好是呼叫它的路徑(例如,對於腳本,這將是 shebang 行中提供的路徑)。在 Linux 上,您可以使用readlink
或獲取它/proc/$pid/exe
。那個,你不能在不呼叫另一個的情況下進行更改execve
(儘管理論上你可以在記憶體中載入一個新的執行檔並在不呼叫的情況下執行它的程式碼execve
,例如在使用者登陸 execve的一些嘗試)。- 第一個參數通過 execve 系統呼叫傳遞。按照慣例,該參數旨在告訴應用程序它的名稱,讓它知道如何相應地表現,因此通常是程序名稱的含義。在 Linux 上,它可以在 中找到
/proc/$pid/cmdline
,但程序也可以通過修改 指向的記憶體來改變它argv[0]
。還應該注意的是,不同的 Unices 之間存在很多差異。