Lsof Command – Discrepancy When Counting Open Files Per Process

lsof

I am trying to get a list of open files per process. I ran the following one-liner from PerlMonks:

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

It returns the total count of open files, and the process name and pid. The result is sorted in ascending order, and the last line is as follows:

1065702 java:15437

So when I run lsof -p 15437, I would expect it to return the same number, however I'm getting:

$ lsof -p 15437 | wc -l
403

Why the discrepancy?

Addendum

A third source of discrepancy:

$ cd /proc/15437/fd
$ ls -1 | wc -l
216

Best Answer

lsof without arguments gives you the information for all the threads of the every process.

While lsof -p "$pid" only lists open files for the process.

To get the same number, you'd need:

lsof -aKp "$pid"

Also note that lsof doesn't only list files open on file descriptors, it also lists mmapped files (as seen in /proc/*/task/*/maps), the current working directory (as seen in /proc/*/task/*/cwd), the root directory (/proc/*/task/*/root).