尝试获取每个进程打开文件的计数时与 lsof 命令存在差异

尝试获取每个进程打开文件的计数时与 lsof 命令存在差异

我正在尝试获取每个进程打开的文件列表。我运行了以下一行珀尔蒙克斯:

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)。

相关内容