Несоответствие команды lsof при попытке получить количество открытых файлов на каждый процесс

Я пытаюсь получить список открытых файлов для каждого процесса. Я запустил следующий однострочный шрифт от PerlMonks :

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 

lsof без аргументов дает вам информацию для всех потоков каждого процесса.

В то время как lsof -p "$pid" отображает только открытые файлы для процесса.

Чтобы получить тот же номер, вам понадобится:

 lsof -aKp "$pid" 

Также обратите внимание, что lsof не только отображает файлы в дескрипторах файлов, но также отображает mmapped файлы (как показано в /proc/*/task/*/maps ), текущий рабочий каталог (как показано в /proc/*/task/*/cwd ), корневой каталог ( /proc/*/task/*/root ).