
我想知道目前運行的路徑./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
答案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