我想知道当前运行的路径./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