lsof - Listando Arquivos e Portas Abertos

lsof - Listando Arquivos e Portas Abertos

O Que Voce Vai Aprender

  • Como encontrar qual processo usa um arquivo ou porta com lsof
  • Como diagnosticar "device is busy ao desmontar" e "porta ja em uso"
  • Por que o espaco em disco nao e liberado apos deletar (arquivos deletados mas abertos)

Resumo Rapido

  • Verificar porta --> lsof -i :8080
  • Arquivos abertos por um processo --> lsof -p <PID>
  • Quem usa este arquivo --> lsof /caminho/para/arquivo
  • Se a saida estiver vazia ou lenta, adicione sudo e -n -P

Pre-requisitos

  • SO: Ubuntu / baseado em RHEL (lsof pode ser um pacote separado)
  • Se ausente: sudo apt install lsof / sudo dnf install lsof
  • Voce precisa de sudo para ver processos de outros usuarios

O Que E o lsof?

Conclusao: lsof (list open files) lista todos os arquivos atualmente abertos. No Linux, sockets e pipes tambem sao arquivos, entao lsof funciona como ferramenta de investigacao de rede.

No Linux, quase tudo e um arquivo. Isso inclui nao apenas arquivos e diretorios regulares, mas sockets de rede, pipes, dispositivos e dispositivos de bloco. Como lsof lista todos eles em um so lugar, ele se torna um canivete suico para troubleshooting.

Execute sem argumentos e ele despeja todos os arquivos abertos no sistema.

$ sudo lsof | head
COMMAND     PID   USER   FD   TYPE DEVICE  SIZE/OFF    NODE NAME
systemd       1   root  cwd    DIR  254,1      4096       2 /
systemd       1   root  txt    REG  254,1   1620224  393431 /usr/lib/systemd/systemd
sshd        812   root    3u  IPv4  18654       0t0     TCP *:ssh (LISTEN)

O que as colunas significam:

  • COMMAND / PID / USER: o processo que detem o arquivo e seu dono
  • FD: descritor de arquivo (cwd=diretorio atual, txt=executavel, 3u=fd 3 aberto para leitura+escrita, etc.)
  • TYPE: REG (arquivo regular) / DIR / IPv4 / unix (socket UNIX), etc.
  • NAME: caminho do arquivo ou endpoint de conexao

O dump sem filtro raramente e util. A filtragem nas secoes abaixo e o fluxo de trabalho real.

Qual Processo Esta Usando uma Porta?

Conclusao: lsof -i :PORT identifica o processo que ocupa uma porta, com seu PID. E a opcao padrao para investigar "Address already in use".

O uso mais comum e encontrar quem ocupa uma porta. -i filtra para conexoes de rede.

# Processo usando a porta 8080
$ sudo lsof -i :8080
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    24531 hide   22u  IPv4 184213      0t0  TCP *:8080 (LISTEN)

Tendo o PID (24531 aqui), voce pode para-lo diretamente.

$ kill 24531

Para listar somente portas em escuta, filtre por protocolo e estado.

# Mostrar todas as portas TCP em estado LISTEN
$ sudo lsof -iTCP -sTCP:LISTEN -P -n
  • -P: nao converter numeros de porta para nomes como http (manter numerico)
  • -n: nao resolver enderecos IP via DNS

-P -n pula resolucao de nomes, tornando a saida mais rapida e facil de ler. Faca disso parte das suas flags padrao de investigacao.

Voce tambem pode direcionar para um host ou porta especificos.

$ sudo lsof -i TCP:22          # conexoes relacionadas a porta 22 (SSH)
$ sudo lsof -i @192.168.1.10   # conexoes com um host especifico

Como Ver os Arquivos que um Processo Tem Abertos?

Conclusao: lsof -p <PID> lista todos os arquivos que o processo tem abertos (logs, sockets, bibliotecas). E util para inspecionar um processo cujo comportamento nao esta claro.

# Arquivos abertos pelo PID 24531
$ sudo lsof -p 24531

Voce ve de imediato onde ele escreve logs, quais arquivos de configuracao le e quais sockets tem abertos. Especifique multiplos PIDs com virgulas.

$ sudo lsof -p 24531,800

Voce tambem pode filtrar por usuario ou nome de comando.

$ sudo lsof -u hide        # arquivos abertos pelo usuario hide
$ sudo lsof -c nginx       # processos cujo comando comeca com nginx

Combinar -u, -c e -i e uma correspondencia OU (qualquer um deles). Para exigir todas as condicoes (E), adicione -a.

# nginx E uma conexao TCP
$ sudo lsof -a -c nginx -i TCP

Quem Esta Usando Este Arquivo?

Conclusao: lsof /caminho faz busca reversa dos processos que tem um arquivo (ou diretorio) aberto. E a solucao para "device is busy" ao desmontar.

Todo mundo ja encontrou target is busy ao tentar desmontar um drive USB. A causa e simples: algo tem um arquivo naquele diretorio aberto.

# Encontrar o processo usando /mnt/usb
$ sudo lsof /mnt/usb

Para buscar em uma arvore de diretorios recursivamente, use +D.

$ sudo lsof +D /mnt/usb

Tendo o PID, encerre o processo ou faca-o sair do diretorio, e a desmontagem tera sucesso.

Combinar com kill

-t retorna somente os PIDs, prontos para encadear diretamente com kill.

# Encerrar todos os processos usando /mnt/usb
$ sudo kill $(sudo lsof -t /mnt/usb)

Forcar encerramento e ultimo recurso. Verifique quais sao os processos (sem -t) primeiro.

Deletei um Arquivo mas o Disco Ainda Esta Cheio

Conclusao: Deletar um arquivo que um processo ainda tem aberto nao libera o espaco ate o processo encerrar. Use lsof | grep deleted para encontrar o responsavel.

"Eu dei rm em um log enorme mas df nao mostra espaco extra livre" e uma armadilha classica. Enquanto algum processo tiver o arquivo aberto, rm so remove o link; os dados reais (inode) permanecem ate o descritor ser fechado.

# Encontrar arquivos deletados mas ainda abertos
$ sudo lsof -nP | grep '(deleted)'
java   3120 app   5w   REG  254,1  2147483648  394102 /var/log/app/huge.log (deleted)

Para recuperar o espaco aqui, voce deve reiniciar o processo (ou fechar o fd causador). rm huge.log sozinho claramente nao e suficiente.

Para arquivos de log de servicos, prefira rotacao (logrotate com copytruncate) ou truncate -s 0 ao inves de rm. Um rm simples facilmente cria esse estado de deletado-mas-aberto.

Tabela de Referencia de Opcoes Comuns

Conclusao: Comece por um dos tres pontos de entrada -- -i (porta), -p (processo) ou um caminho (arquivo). Depois acelere com -n -P e encadeie com kill usando -t.

Objetivo Comando
Verificar quem ocupa uma porta lsof -i :8080
Listar portas em escuta lsof -iTCP -sTCP:LISTEN -P -n
Arquivos abertos por um processo lsof -p <PID>
Arquivos abertos por um usuario lsof -u <user>
Processo usando um arquivo lsof /caminho/para/arquivo
Buscar recursivamente em diretorio lsof +D /caminho
Arquivos deletados mas abertos lsof -nP | grep '(deleted)'
Saida somente PID (encadear com kill) lsof -t /caminho

Templates de investigacao para copiar e colar

# Encontrar o processo ocupando uma porta
sudo lsof -i :8080 -P -n

# Encontrar a causa de "device is busy"
sudo lsof +D /mnt/usb

# Encontrar arquivos deletados ainda consumindo espaco em disco
sudo lsof -nP | grep '(deleted)'

Proximas Leituras