Discrepância com o comando lsof ao tentar obter a contagem de arquivos abertos por processo

5

Estou tentando obter uma lista de arquivos abertos por processo. Eu corri o seguinte one-liner de PerlMonks :

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

Retorna a contagem total de arquivos abertos e o nome do processo e o pid. O resultado é classificado em ordem crescente e a última linha é a seguinte:

1065702 java:15437

Portanto, quando eu executar lsof -p 15437 , esperarei que ele retorne o mesmo número, mas estou recebendo:

$ lsof -p 15437 | wc -l
403

Por que a discrepância?

Adendo

Uma terceira fonte de discrepância:

$ cd /proc/15437/fd
$ ls -1 | wc -l
216
    
por Saulo Silva 29.04.2015 / 20:29

1 resposta

6

lsof sem argumentos fornece as informações para todos os segmentos de cada processo.

Enquanto lsof -p "$pid" apenas lista arquivos abertos para o processo.

Para obter o mesmo número, você precisa:

lsof -aKp "$pid"

Observe também que lsof não lista apenas arquivos abertos em descritores de arquivos, ele também lista arquivos mmap (como visto em /proc/*/task/*/maps ), o diretório de trabalho atual (como visto em /proc/*/task/*/cwd ), o diretório raiz (%código%).

    
por 29.04.2015 / 21:27

Tags