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

Sau*_*lva 5 lsof

我正在尝试获取每个进程的打开文件列表。我从PerlMonks运行了以下单行:

lsof | perl -lane '$x{"$F[0]:$F[1]"}++;
END { print "$x{$_}\t$_" for sort {$x{$a}<=>$x{$b}} keys %x}'
Run Code Online (Sandbox Code Playgroud)

它返回打开文件的总数,以及进程名称和 pid。结果按升序排列,最后一行如下:

1065702 java:15437
Run Code Online (Sandbox Code Playgroud)

所以当我运行时lsof -p 15437,我希望它返回相同的数字,但是我得到:

$ lsof -p 15437 | wc -l
403
Run Code Online (Sandbox Code Playgroud)

为什么会出现差异?

附录

差异的第三个来源:

$ cd /proc/15437/fd
$ ls -1 | wc -l
216
Run Code Online (Sandbox Code Playgroud)

Sté*_*las 6

lsof 不带参数为您提供每个进程的所有线程的信息。

虽然lsof -p "$pid"只列出进程的打开文件。

要获得相同的数字,您需要:

lsof -aKp "$pid"
Run Code Online (Sandbox Code Playgroud)

另请注意,lsof它不仅会列出在文件描述符上打开的文件,还会列出映射文件(如 中所示/proc/*/task/*/maps)、当前工作目录(如 中所示/proc/*/task/*/cwd)、根目录 ( /proc/*/task/*/root)。