如何將 grep 的輸出傳遞給「lsof -p」?

如何將 grep 的輸出傳遞給「lsof -p」?

我想知道目前運行的路徑./a.out

有多個 MPI 進程,但我只需要幾個 PID 之一./a.out。所以我先使用下面的程式碼來 grep 它:

ps aux | grep -P "Rl.*a\.out" | grep -oP "\d+"|head -n 1

它給予一個 PID,例如 12345。

現在我想使用:

lsof -p12345 

知道PID 12345的檔案路徑。

如何將兩步合併到一個命令列?

答案1

這是您需要的命令:

ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1 | xargs lsof -p

這裡的關鍵是xargs

諸如grep和 之類的命令awk可以接受標準輸入(STDIN) 作為參數,或使用管道作為參數。然而,其他諸如cpecho和 則lsof忽略標準輸入流並僅依賴論點命令後發現。

使用命令xargs您可以從標準輸入建置和執行命令列。

答案2

我建議xargs在命令返回多行(或記錄)時使用。在這種情況下,該命令會傳回一個 PID 和一個稱為命令替換將是一個合適的解決方案。

這允許一個命令的輸出被另一個命令使用,並且透過將提供輸入的命令包裝在$(和中來完成)。過去使用反引號 (`),但不再建議使用。

lsof -p $(ps aux|grep -P "Rl.*a\.out"|grep -oP "\d+"|head -n 1)

答案3

根據名稱查找 PID 的第一個複雜命令可以替換為pgrep,例如

$ pgrep -nf a.out
70512

然後要取得路徑lsof,您可以在 中使用條件列印awk

所以命令可以是:

$ lsof -p $(pgrep -nf a.out) | awk '$4 == "cwd" {print $9}'

以上基於以下lsof輸出:

$ lsof -p $(pgrep -nf a.out)
COMMAND   PID   USER   FD   TYPE DEVICE  SIZE/OFF      NODE NAME
gsleep  70513 kenorb  cwd    DIR    1,4      1938 121793972 /my/path

相關內容