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

Why the discrepancy?


A third source of discrepancy:

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

1 Answer 1


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 -a -K -p "$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).


You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .