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

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

  • If lsof -p "$pid" only lists open files for the process, why does it not match ls -1 /proc/$pid/fd | wc -l? – Saulo Silva May 1 '15 at 16:44

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.