如何在没有lsof的情况下检查打开的文件

时间:2012-05-29 09:19:44

标签: android lsof

在linux中,我使用lsof检查文件是由哪个进程打开的。我有一个Android设备,但没有lsof命令。是否可以找到打开特定文件的进程?

我将使用它来验证MediaPlayer是否持有fd,但应该关闭它。

4 个答案:

答案 0 :(得分:15)

穷人的lsof是执行

ls -l  /proc/[process id]/fd

但是,你需要成为root。

答案 1 :(得分:3)

感谢迈克琼斯和Joqn与穷人的lsof提示。我在busybox(synology nas)中使用它来列出在每个进程下分组的fd目录:

  for p in [0-9]*; do ls -l /proc/$p/fd ;done 

答案 2 :(得分:1)

安装busybox,它有一个lsof命令。

答案 3 :(得分:0)

将上述/ proc与关于在目录树中搜索符号链接的this question的答案相结合,得出以下结果:

# 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_readdir_race避免了由于流程短暂而导致的错误,-prune摆脱了任务级别的结果(在第一个流程中停止时并不是绝对必要的,因为这些路径仍会给出相同的答案,但有助于避免在其他用例中出现冗余,例如列出所有结果)

-printcut合并以直接提取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获取进程详细信息(根据对this SuperUser question的回答):

# ps -p 4140 -o command=
/some/command --with=some args

(请注意,我在Linux上进行了测试,它在BSD上应该可以正常工作,但是我不确定100%知道Android)