我正在尝试获取每个进程打开的文件列表。我运行了以下一行珀尔蒙克斯:
lsof | perl -lane '$x{"$F[0]:$F[1]"}++;
END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
它返回打开文件的总数以及进程名称和 pid。结果按升序排序,最后一行如下:
1065702 java:15437
因此,当我运行时lsof -p 15437
,我希望它返回相同的数字,但是我得到:
$ lsof -p 15437 | wc -l
403
为什么会出现差异?
附录
差异的第三个来源:
$ cd /proc/15437/fd
$ ls -1 | wc -l
216
答案1
lsof
不带参数为您提供每个进程的所有线程的信息。
而lsof -p "$pid"
仅列出进程的打开文件。
要获得相同的号码,您需要:
lsof -a -K -p "$pid"
另请注意,它lsof
不仅列出文件描述符上打开的文件,还列出映射文件(如 中所示/proc/*/task/*/maps
)、当前工作目录(如中所示/proc/*/task/*/cwd
)、根目录 ( /proc/*/task/*/root
)。