進一步閱讀

進一步閱讀

為什麼pgrep需要?如果我們可以一起使用psand grep,為什麼我們還需要pgrep?如果我們有一個命令lsgrep或 ,那就很奇怪了curlgrep

但我注意到的一個區別是,如果我們首先使用以下命令啟動 tmux 會話

tmux new -s foo

然後

ps aux | grep tmux

將無法找到 tmux 伺服器進程,但是

pgrep -l tmux

能。但是,為什麼我們沒有一個 標誌,ps以便我們grep能夠pgrep看到 tmux 伺服器進程呢?psgrep和有什麼差別pgrep

答案1

ps命令有兩個字段,通常以這種方式搜索,theargs和 thecomm。第一個是程式參數字串,以 NUL 分隔。第二個是程式的「名稱」。這些是單獨儲存的,並且(在各種作業系統上)可以兩個都在運行時由程式本身更改。諸如此類的程序tmux確實做到了這一點。

的輸出ps不可機器解析。多個字段可以包含未編碼的空白這使得無法可靠地確定字段邊界,因為任意長度的空白都是字段分隔符。 確實argscomm兩個這樣的領域。的輸出ps僅是人類可讀的。

當你的grep輸出ps是模式匹配整行時,沒有可靠的方法將該模式錨定到相關的特定字段,除了透過消除幾乎所有其他有用的東西,以及您可能首先嘗試透過此方法找到的東西。

舉些例子:

%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
%

進一步閱讀

  • psNetBSD通用指令手冊。 2016年12月2日。
  • visNetBSD 庫函數手冊。 2017年4月22日。
  • 什洛米·諾奇 (2009-10-01)。 如何不測試 mysqld 是否還活著。 code.openark.org。
  • 格雷格·伍利奇. 《解析進程樹的風險》流程管理。格雷格的維基。
  • 喬納森·德博因·波拉德 (2015)。clearenv小吃指南。軟體.
  • 喬納森·德博因·波拉德 (2015)。setenv小吃指南。軟體.
  • 喬納森·德博因·波拉德 (2020)。ps小吃指南。軟體.
  • 喬納森·德博因·波拉德 (2020)。list-process-table小吃指南。軟體.

相關內容