為什麼pgrep
需要?如果我們可以一起使用ps
and grep
,為什麼我們還需要pgrep
?如果我們有一個命令lsgrep
或 ,那就很奇怪了curlgrep
。
但我注意到的一個區別是,如果我們首先使用以下命令啟動 tmux 會話
tmux new -s foo
然後
ps aux | grep tmux
將無法找到 tmux 伺服器進程,但是
pgrep -l tmux
能。但是,為什麼我們沒有一個 標誌,ps
以便我們grep
能夠pgrep
看到 tmux 伺服器進程呢?ps
和grep
和有什麼差別pgrep
?
答案1
該ps
命令有兩個字段,通常以這種方式搜索,theargs
和 thecomm
。第一個是程式參數字串,以 NUL 分隔。第二個是程式的「名稱」。這些是單獨儲存的,並且(在各種作業系統上)可以兩個都在運行時由程式本身更改。諸如此類的程序tmux
確實做到了這一點。
的輸出ps
是不可機器解析。多個字段可以包含未編碼的空白這使得無法可靠地確定字段邊界,因為任意長度的空白都是也字段分隔符。 確實args
是comm
兩個這樣的領域。的輸出ps
僅是人類可讀的。
當你的grep
輸出ps
是模式匹配整行時,沒有可靠的方法將該模式錨定到相關的特定字段,除了透過消除幾乎所有其他有用的東西,以及您可能首先嘗試透過此方法找到的東西。
舉些例子:
- 當您
u
選擇 Linuxps
(在-u
BSD 中ps
)時,有一個user
包含使用者名稱的字段,grep
查找程式名稱的模式有時也會碰巧匹配。 - 規範問題(範例為“ps -ef | ps -ef 和有什麼不一樣? grep WDA 和 ps -ef | grep [W]DA?“,”符合節目名,為什麼點擊率這麼高?“,”`ps | 中第二個 grep 的功能grep -v | | grep -v | grep`「, 和許多其他地方)當然是傳遞給的模式
grep
與grep
進程自己的args
. - 它也可能恰好匹配環境字串,考慮到經常在
_
環境變數中找到的內容,這一點尤其令人心酸。
%ps -a -x -e -o sid,comm,args | ps -a -x -e -o sid,comm,args | grep dbus 守護程式 | 頭-n 4 25 nosh cyclog dbus-daemon/(nosh) 25 dbus-daemon dbus-daemon --config-file ./system-wide.conf --nofork --address=unix:path=/run/dbus/system_bus_socket 第989章 dbus-daemon --config-file ./per-user.conf --nofork --address=unix:path=/run/user/JdeBP/bus 15107 grep grep dbus 守護程式 % %clearenv --keep-path \ setenv WIBBLE tmux \ ps -a -x -e -o sid,comm,指令 | grep tmux 15107 ps PATH=/usr/local/bin:/usr/bin:/bin WIBBLE=tmux ps -a -x -e -o sid,pid,comm,指令 %
換句話說:grep
用於對包含行的文字檔案進行操作。進程表不是文字文件,將其視為文字文件(透過使用命令對其進行翻譯ps
)會丟失有關欄位的資訊。
執行此類搜尋的方法是使用 以外的其他內容查看進程表ps
。在 Linux 上,可以直接查看/proc/${PID}/comm
參數字串、環境字串等的類似偽檔案。
或者可以寫一個工具來釣魚需要配對的具體數據從進程表中,並且僅在該欄位上執行模式處理。該工具不適用於文字文件,而是用於流程表。可以稱之為pgrep
。
當然,可以在緊握的手上寫下ps
其輸出能處理(比如說)awk
,因為它是機器可讀,對空白進行編碼vis()
,從而提供awk
可以正確識別的欄位。缺點是那就比較少了人類- 可讀性強,但不完全ps
是符合者應有的樣子。我傳遞它的輸出來console-flat-table-viewer
讀取它。 ☺
%系統控制 ps -p 740 -o sid,comm,args SID 指令 指令 25 dbus-daemon dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' % %系統控制 ps -A -o sid,comm,args,envs,tree | awk '{ if ("dbus-daemon"==$2) print $3; }' dbus-daemon\040--config-file\040./system-wide.conf\040--nofork\040'--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon\040--config-file\040./per-user.conf\040--nofork\040'--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon\040--fork\040--print-pid\0405\040--print-address\0407\040--session % %系統控制 ps -A -o sid,comm,args,envs,tree | awk '{ if ("dbus-daemon"==$2) print $3; }' | 聯合國維斯 dbus-daemon --config-file ./system-wide.conf --nofork '--address=unix:path=/run/dbus/system_bus_socket' dbus-daemon --config-file ./per-user.conf --nofork '--address=unix:path=/run/user/JdeBP/bus' /usr/local/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session %
進一步閱讀
ps
。NetBSD通用指令手冊。 2016年12月2日。vis
。NetBSD 庫函數手冊。 2017年4月22日。- 什洛米·諾奇 (2009-10-01)。 如何不測試 mysqld 是否還活著。 code.openark.org。
- 格雷格·伍利奇. 《解析進程樹的風險》。流程管理。格雷格的維基。
- 喬納森·德博因·波拉德 (2015)。
clearenv
。小吃指南。軟體. - 喬納森·德博因·波拉德 (2015)。
setenv
。小吃指南。軟體. - 喬納森·德博因·波拉德 (2020)。
ps
。小吃指南。軟體. - 喬納森·德博因·波拉德 (2020)。
list-process-table
。小吃指南。軟體.