
現在実行中のパスを知りたい./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
答え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