在linux中,我使用lsof检查文件是由哪个进程打开的。我有一个Android设备,但没有lsof命令。是否可以找到打开特定文件的进程?
我将使用它来验证MediaPlayer是否持有fd,但应该关闭它。
答案 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
摆脱了任务级别的结果(在第一个流程中停止时并不是绝对必要的,因为这些路径仍会给出相同的答案,但有助于避免在其他用例中出现冗余,例如列出所有结果)
将-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获取进程详细信息(根据对this SuperUser question的回答):
# ps -p 4140 -o command=
/some/command --with=some args
(请注意,我在Linux上进行了测试,它在BSD上应该可以正常工作,但是我不确定100%知道Android)