grep の出力を「lsof -p」に渡すにはどうすればいいですか?

grep の出力を「lsof -p」に渡すにはどうすればいいですか?

現在実行中のパスを知りたい./a.out

MPI プロセスは複数ありますが、必要なのはそのうちの 1 つの PID だけです./a.out。そこで、まず以下のコードを使用して grep します。

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

これにより、1 つの PID (例: 12345) が生成されます。

今、私が使いたいのは:

lsof -p12345 

PID 12345 のファイル パスを確認します。

2 つのステップを 1 つのコマンド ラインに結合するにはどうすればよいでしょうか?

答え1

必要なコマンドは次のとおりです:

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

ここで重要なのは ですxargs

grepやなどのコマンドはawk標準入力(STDIN)をパラメータとして、またはパイプを使用して引数として渡すことができます。ただし、、などの他の関数はcp標準echo入力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

関連情報