Qual é a diferença entre `lsof -p <pid> | wc -l` e `ls / proc / <pid> / fd | wc -l`?

12

Histórico: estou brincando de monitorar o ulimit para executar processos para um usuário específico. (Ocasionalmente, vi processos que estavam iniciando com um limite incorreto.) Perguntei a alguns gurus do Linux que se professavam e um sugeriu lsof -p <pid>, enquanto o outro sugeriu ls /proc/<pid>/fd, mas nenhum foi positivo sobre o que reflete com mais precisão a contagem real em relação ao máximo limite de arquivos abertos para um processo.

Então, qual é?

lsof -p <pid> | wc -l

Ou

ls /proc/<pid>/fd | wc -l

Por favor, elabore a diferença. Obrigado!

Jared
fonte
3
Soa como lição de casa.
precisa saber é o seguinte
1
Não é dever de casa. Adicionado melhor explicação. Eu tinha lido as lsofpáginas de manual e, embora suspeitasse que a resposta fosse arquivos mapeados na memória, queria a confirmação de uma pessoa mais experiente.
Jared

Respostas:

10

lsoftambém fornecerá arquivos .so mapeados na memória - o que tecnicamente não é o mesmo que um manipulador de arquivos que o aplicativo tem controle. /proc/<pid>/fdé o ponto de medição para descritores de arquivos abertos - no entanto: mencionado na página proc-man - se o encadeamento principal de um programa multithread tiver terminado, esse diretório estará indisponível.

lsof -p <pid> | grep -v mem | egrep -v '^COMMAND PID' | wc -lmostrará os mesmos itens que ls /proc/<pid>/fd | wc -l.

Os mapas de memória estão disponíveis em /proc/<pid>/maps.

Kvisle
fonte
A lsofdá-lhe quase a mesma saída, mas inclui também cwd, rtde txtdescritores de arquivos.
22616 Ian Bamforth
Observe também que o número de espaços entre COMMANDe PIDpode variar. Substitua os espaços por [[:space:]]*para torná-lo mais geral.
21916 Ian Bamforth
Eu também encontrei lsof -a -p <pid> -d ^mem -d ^cwd -d ^rtd -d ^txt -d ^DEL | wc -l aqui , enquanto o lsofshell do Android ( adb shell) não suporta -ae -d. Então eu uso a versão do Kvisle finalmente.
Weekend