像这样的东西:
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 {} \;
.