Android 如何在没有lsof的情况下检查打开的文件
在linux中,我使用lsof检查文件是由哪个进程打开的。我有一个安卓设备,但没有lsof命令。是否可以找到打开特定文件的进程Android 如何在没有lsof的情况下检查打开的文件,android,lsof,Android,Lsof,在linux中,我使用lsof检查文件是由哪个进程打开的。我有一个安卓设备,但没有lsof命令。是否可以找到打开特定文件的进程 我将使用它来验证MediaPlayer是否持有fd,但它应该关闭。安装busybox,它有一个lsof命令 穷人的lsof是执行死刑 ls -l /proc/[process id]/fd 尽管如此,你还是需要成为root。感谢迈克·琼斯和乔恩为《穷人的lsof》提供的提示。我在busybox(synology nas)上的以下内容中使用了它来列出每个进程下分组的f
我将使用它来验证MediaPlayer是否持有fd,但它应该关闭。安装busybox,它有一个lsof命令 穷人的lsof是执行死刑
ls -l /proc/[process id]/fd
尽管如此,你还是需要成为root。感谢迈克·琼斯和乔恩为《穷人的lsof》提供的提示。我在busybox(synology nas)上的以下内容中使用了它来列出每个进程下分组的fd目录:
for p in [0-9]*; do ls -l /proc/$p/fd ;done
将以上基于/proc的内容与关于在目录树中搜索符号链接的答案结合起来,可以得出以下结论:
# find /proc -ignore_readdir_race -name task -prune -o -path '*/fd/*' -lname '/file/of/interest' -ls -quit
37023 0 l-wx------ 1 username username 64 Dec 16 09:06 /proc/4140/fd/1 -> /file/of/interest
-ignore\u readdir\u race
避免了由于短流程而导致的错误,-prune
消除了任务级结果(在第一个流程停止时,这不是严格必要的,因为这些路径仍然会给出相同的答案,但对于避免其他用例中的冗余非常有用,如列出所有结果)
将-print
与cut
组合,直接提取pid:
# find /proc -ignore_readdir_race -name task -prune -o -path '*/fd/*' -lname '/file/of/interest' -print -quit | cut -d / -f 3
4140
获得pid后,您可以使用ps获取流程详细信息(根据以下答案):
(注意,我在Linux上测试了这个功能,在BSD上应该也可以,但我对Android不是100%确定)添加了'lsof',commit
8b9b105bc7bf6428591d55462b3e727ba7504b29
。从源代码中取出所需的位,如果目标版本中不存在NDK,则使用NDK进行构建。我使用busy box,但仍然得到“??”我如何获得值?这是一个不同的命令吗?我已经在根访问中,命令运行并给出一个表,我期望值,但我得到的只是问号“?”任何想法thanxI在我的手机上安装了Busybox,但它没有向我提供lsof命令:-(可能这是特定于手机的,但我在小程序列表中找不到它。对于大多数体系结构,这里都有静态链接的busybox二进制文件:ls-l/proc/*/fd
,可以像默认情况下lsof那样查看所有打开的文件。谢谢。看起来这需要在/proc文件夹中运行-对于p in/proc,可能更一般地说应该是)/[0-9]*;是否ls-l$p/fd;是否完成?
# ps -p 4140 -o command=
/some/command --with=some args