Como exibir descritores de arquivos abertos, mas não usando o comando lsof

48

Olá, Li aqui que lsof não é uma maneira precisa de obter o número de descritores de arquivos que estão abertos no momento. Ele recomendou usar esse comando

 cat /proc/sys/fs/file-nr

Enquanto este comando exibe o número de FDs, como você exibe a lista de descritores de arquivos abertos que o comando acima contou?

dimas
fonte
4
Você provavelmente quer saber se o seu limite é excedido, certo? Eu escrevi sobre isso em linuxintro.org/wiki/Is_my_ulimit_exceeded ; mais importante, o ulimit é uma restrição por processo que você pode encontrar sob / proc / PID / limits e, em vez de lsof, eu usaria ls / proc / PID / fd para listar os descritores de arquivo do processo.
22615 Thorith Staerk

Respostas:

60

Há dois motivos para lsof | wc -lnão contar os descritores de arquivo. Uma é que lista coisas que não são arquivos abertos, como bibliotecas carregadas dinamicamente e diretórios de trabalho atuais; você precisa filtrá-los. Outra é que lsofleva algum tempo para ser executada; portanto, pode haver perda de arquivos que são abertos ou fechados enquanto estão em execução; portanto, o número de arquivos abertos listados é aproximado. Olhar /proc/sys/fs/file-nrfornece um valor exato em um determinado momento.

cat /proc/sys/fs/file-nrsó é útil quando você precisa da figura exata, principalmente para verificar a exaustão de recursos. Se você quiser listar os arquivos abertos, precisará chamar lsofou usar algum método equivalente, como arrastar /proc/*/fdmanualmente.

Gilles 'SO- parar de ser mau'
fonte
1
Oi obrigado por dar uma boa explicação Gilles. Eu tentei ls / proc / * / fd e recebi todos os fd abertos naquele momento. Está produzindo uma saída com algum código de cores, vou apenas dar uma olhada no manual.
dimas 27/02
Os /proc/*/fddiretórios @dimas contêm links simbólicos para os arquivos abertos. Para inspeção visual, use ls -l. Para tratamento automatizado, use readlinkpara extrair o destino do link.
Gilles 'SO- stop be evil'
Basta usar ls -l, mas vou experimentar o readlink. Tentei outros / proc / PID / maps e outras opções conforme especificado aqui kernel.org/doc/man-pages/online/pages/man5/proc.5.html . Mais uma vez obrigado pela informação adicional.
dimas 27/02
1
/ proc / sys / fs / file-nr me fornece 3872 (e dois outros números). Como isso pode ser a contagem de arquivos que eu abri se ulimit -n me mostra 1024?
Thorsten Staerk
1
@ThorstenStaerk Todas as configurações de setrlimit(a chamada do sistema subjacente ao ulimitcomando shell) são por processo. Eles afetam apenas o processo que faz a chamada (e indiretamente os processos que ela bifurca posteriormente).
Gilles 'SO- stop be evil'
25

As informações do processo são mantidas dinamicamente pelo sistema nos diretórios em / proc. Por exemplo, o processo com o PID 1234 terá um diretório chamado / proc / 1234.

Há bastante informação lá, mas agora você está interessado no subdiretório / proc / 1234 / fd .

NOTA: Você precisa ter permissões de root para exibir ou abrir arquivos para processos que você não possui, bem como para processos SetUID.

Exemplo:

root@johan-HP-ProBook-6560b-LG654EA-ACQ:/proc# ls -l 2443/fd
total 0
lr-x------ 1 johan johan 64 Feb 27 10:26 0 -> pipe:[13637]
l-wx------ 1 johan johan 64 Feb 27 10:26 1 -> /home/johan/.xsession-errors
lrwx------ 1 johan johan 64 Feb 27 10:26 10 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 11 -> anon_inode:[eventfd]
lrwx------ 1 johan johan 64 Feb 27 10:26 12 -> socket:[39495]
lrwx------ 1 johan johan 64 Feb 27 10:26 13 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 14 -> anon_inode:inotify
lrwx------ 1 johan johan 64 Feb 27 10:26 15 -> anon_inode:[eventfd]
l-wx------ 1 johan johan 64 Feb 27 10:26 16 -> pipe:[37885]
lr-x------ 1 johan johan 64 Feb 27 10:26 17 -> pipe:[37886]
l-wx------ 1 johan johan 64 Feb 27 10:26 2 -> /home/johan/.xsession-errors
l-wx------ 1 johan johan 64 Feb 27 10:26 21 -> pipe:[167984]
lr-x------ 1 johan johan 64 Feb 27 10:26 22 -> pipe:[167985]
l-wx------ 1 johan johan 64 Feb 27 10:26 23 -> pipe:[170009]
lr-x------ 1 johan johan 64 Feb 27 10:26 24 -> pipe:[170010]
lrwx------ 1 johan johan 64 Feb 27 10:26 3 -> anon_inode:[eventfd]
lr-x------ 1 johan johan 64 Feb 27 10:26 4 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 5 -> socket:[14721]
l-wx------ 1 johan johan 64 Feb 27 10:26 6 -> pipe:[14726]
lrwx------ 1 johan johan 64 Feb 27 10:26 7 -> socket:[14730]
lrwx------ 1 johan johan 64 Feb 27 10:26 8 -> socket:[13984]
lrwx------ 1 johan johan 64 Feb 27 10:26 9 -> socket:[14767]

root@johan-HP:/proc# cat 2443/fdinfo/2
pos:    1244446
flags:  0102001

Também dê uma olhada no restante dos arquivos em / proc ... muitas informações úteis do sistema residem aqui.

Johan
fonte