Qual é a diferença entre lsof vs lsof -i

2

Um dos meus processos em execução no servidor Debian começou a gerar um erro socket: too many open files . Então comecei a depurar o erro. Eu vim através do seguinte cenário.

Quando eu executei lsof | grep 4300 , a saída é a seguinte

Quando eu corri lsof -i TCP:4300 , a saída é

Agora as perguntas são:

  1. Qual é a diferença entre os dois? (Minha observação é que o primeiro tem thread Id e este último não tem)

  2. Por que existem várias linhas para a mesma conexão no primeiro? (SS está dando apenas 4 linhas).

  3. Quantos descritores de arquivos estão abertos?

  4. Como depurar este cenário?

por Santhosh Tangudu 06.06.2018 / 14:31

1 resposta

1

Estou fazendo referência à página do lsof para minha resposta.

lsof | grep 4300

In the absence of any options, lsof lists all open files belonging to all active processes.

Portanto, este comando lista todos os arquivos abertos pertencentes a todo o processo, você canalizou sua saída para grep procurando apenas os que correspondem ao operando de pesquisa "4300".

lsof -i TCP:4300 

This option selects the listing of files any of whose Internet address matches the address specified in i. If no address is specified, this option selects the listing of all Internet and x.25 (HP-UX) network files.

Com este comando, você especificou que deseja apenas listar arquivos com um endereço de Internet ou local de rede, especificando também que você deseja apenas aqueles que correspondam ao protocolo tcp na porta 4300.

Respondendo suas perguntas

  1. Os resultados dos dois comandos são diferentes, pois o primeiro comando é listar todos os arquivos abertos, mas a saída é filtrada por grep para todas as linhas que possuem "4300". O segundo comando especifica apenas arquivos de Internet ou de rede abertos que usam o protocolo tcp na porta 4300.

  2. De acordo com este post , seu processo poderia simplesmente ter o arquivo aberto várias vezes. Esse não é um comportamento inesperado de lsof . Definitivamente, é o seu problema e eu investigaria o que cada um desses processos está fazendo e por que eles precisam ter várias cópias desses arquivos abertos.

  3. Se você incluiu toda a saída dos seus comandos, então, com o primeiro, existem 3 processos que têm seus respectivos arquivos abertos 5 vezes. Em seu segundo comando, existem 3 processos com arquivos de rede abertos usando o protocolo tcp na porta 4300 e um processo que está escutando esse protocolo e porta.

  4. Eu procuraria o que cada processo é baseado fora do pid. Referenciando esta postagem você pode procurar um processo por pid usando este comando: ps -p <PID> -o comm= . Como alternativa, tive muito sucesso com ps aux | grep <PID> para identificar um processo.

Conclusão

A partir daqui, você precisará procurar se esse é o comportamento esperado do processo e como remediar isso se eles forem a causa do erro inicial. Não se esqueça de referenciar quaisquer logs com os quais o erro e os processos possam estar associados.

Se houver algum equívoco ou dúvida sobre esta resposta, por favor, comente. Vou editar este post conforme necessário para melhorar a resposta.

Melhor da sorte!

    
por 07.06.2018 / 16:00