在linux中,我使用lsof来检查文件是由哪个进程打开的。我有一个 android 设备,但没有 lsof 命令。是否可以找到打开特定文件的进程?
我将使用它来验证 MediaPlayer 是否持有 fd,但它应该被关闭。
穷人的lsof就是执行
ls -l /proc/[process id]/fd
不过,您需要成为root用户。
感谢 mike jones 和 Joqn 提供穷人 lsof 的小费。我在下面的busybox(synology nas)上使用它来列出分组在每个进程下的fd目录:
for p in [0-9]*; do ls -l /proc/$p/fd ;done
安装busybox,它有一个lsof 命令。
结合上面的 /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_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 获取进程详细信息(根据此 SuperUser question的答案):
# ps -p 4140 -o command=
/some/command --with=some args
(注意,我在 Linux 上对此进行了测试,它在 BSD 上应该也能正常工作,但我对 Android 不是 100% 确定)