12

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

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

4

4 回答 4

29

穷人的lsof就是执行

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

不过,您需要成为root用户。

于 2013-02-25T13:15:51.937 回答
8

感谢 mike jones 和 Joqn 提供穷人 lsof 的小费。我在下面的busybox(synology nas)上使用它来列出分组在每个进程下的fd目录:

  for p in [0-9]*; do ls -l /proc/$p/fd ;done 
于 2015-09-21T23:40:21.170 回答
1

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

于 2012-05-29T09:20:36.860 回答
1

结合上面的 /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% 确定)

于 2020-12-16T09:48:25.120 回答