如何使用find命令获取文件的PID及其所在位置?

如何使用find命令获取文件的PID及其所在位置?

像这样的东西:

PID=3187:/home/morganc/test1.out

如何使用 find 命令才能列出 test1.out 文件的 PID 号及其所在目录?

提前致谢。

答案1

如果您是创建或打开文件的进程的所有者,您可以执行以下操作

ls -o /proc/*/fd 2> /dev/null

这将列出您的用户 ID 的 PID 的所有文件;如果您没有运行很多进程,只需手动查看输出即可。示例:寻找已vmstat.out打开的进程:

mark (/home/mark)> ls -l /proc/*/fd 2> /dev/null
/proc/27669/fd:
total 0
lrwx------. 1 mark mark 64 Feb 13 19:51 0 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:51 1 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 10 -> /dev/pts/0
lr-x------. 1 mark mark 64 Feb 13 19:53 12 -> /home/mark
l-wx------. 1 mark mark 64 Feb 13 19:51 2 -> /dev/null
lrwx------. 1 mark mark 64 Feb 13 19:53 4 -> /home/mark/.sh_history

/proc/27737/fd:
total 0
lrwx------. 1 mark mark 64 Feb 13 19:53 0 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 1 -> /dev/pts/0
lrwx------. 1 mark mark 64 Feb 13 19:53 2 -> /dev/pts/0
lr-x------. 1 mark mark 64 Feb 13 19:53 3 -> /home/oracle/log/vmstat.out
lr-x------. 1 mark mark 64 Feb 13 19:53 4 -> anon_inode:inotify

所以 PID27737打开了文件vmstat.out,完整路径是/home/oracle/log/vmstat.out

如果您想过滤掉大部分输出,请尝试以下操作:

mark (/home/oracle/log)> ls -l /proc/*/fd 2> /dev/null | grep -E '(^/proc|vmstat.out)'
/proc/27669/fd:
/proc/27943/fd:
lr-x------. 1 mark mark 64 Feb 13 20:00 3 -> /home/oracle/log/vmstat.out
/proc/28047/fd:
/proc/28048/fd:
/proc/self/fd:
mark (/home/oracle/log)>

然后在感兴趣的文件上方查找 PID。

因此,为了忽略其他进程,我通过管道传输到 awk,保存前一行,并在发现当前行以 开头时打印前一行l

ls -l /proc/*/fd 2> /dev/null | \
  grep -E '(^/proc|vmstat.out)'  | \
  awk 'BEGIN { prev = $0} /proc/ { prev = $0 } /^l/ { print prev  $NF }'

/proc/27943/fd:/home/oracle/log/vmstat.out

答案2

您可以尝试2种解决方案:

fuser /path/to/opened/file

或者

lsof /path/to/opened/file

答案3

根据我如何解释您的问题(请参阅评论),您的解决方案将是:

find $root_dir -name $file_name -exec pidof {} \;

或者:

find $root_dir -name $file_name -exec fuser {} \;

您可以将变量定义$root_dir为要在其下执行搜索的起始目录,以及$file_name要查找的文件的名称。

第一种选择适用于搜索正在运行的可执行文件的情况,而第二种选择适用于由可执行文件运行的数据文件的情况。

为了测试这一点(对于第一个替代方案),我使用命令打开了一个文件less,按C-z停止它并将其放在后台,然后运行find /usr/bin -name less -exec pidof {} \;​​.为了测试第二种选择,我创建了一个数据文件~/test.txt,先运行less ~/test.txt,然后C-z运行,最后是find ~ -name test.txt -exec fuser {} \;.

相关内容