lsof - Listando Arquivos e Portas Abertos

lsof - Listando Arquivos e Portas Abertos

O Que Você Vai Aprender

  • Como encontrar qual processo usa um arquivo ou porta com lsof
  • Como diagnosticar "device is busy ao desmontar" e "porta já em uso"
  • Por que o espaço em disco não é liberado após deletar (arquivos deletados mas abertos)

Resumo Rápido

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

Pré-requisitos

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

O Que É o lsof?

Conclusão: lsof (list open files) lista todos os arquivos atualmente abertos. No Linux, sockets e pipes também são arquivos, então lsof funciona como ferramenta de investigação de rede.

No Linux, quase tudo é um arquivo. Isso inclui não apenas arquivos e diretórios regulares, mas sockets de rede, pipes, dispositivos e dispositivos de bloco. Como lsof lista todos eles em um só lugar, ele se torna um canivete suíço 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 detém o arquivo e seu dono
  • FD: descritor de arquivo (cwd=diretório atual, txt=executável, 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 conexão

O dump sem filtro raramente é útil. A filtragem nas seções abaixo é o fluxo de trabalho real.

Qual Processo Está Usando uma Porta?

Conclusão: lsof -i :PORT identifica o processo que ocupa uma porta, com seu PID. É a opção padrão para investigar "Address already in use".

O uso mais comum é encontrar quem ocupa uma porta. -i filtra para conexões 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), você pode pará-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: não converter números de porta para nomes como http (manter numérico)
  • -n: não resolver endereços IP via DNS

-P -n pula resolução de nomes, tornando a saída mais rápida e fácil de ler. Faça disso parte das suas flags padrão de investigação.

Você também pode direcionar para um host ou porta específicos.

$ 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?

Conclusão: lsof -p <PID> lista todos os arquivos que o processo tem abertos (logs, sockets, bibliotecas). É útil para inspecionar um processo cujo comportamento não está claro.

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

Você vê de imediato onde ele escreve logs, quais arquivos de configuração lê e quais sockets tem abertos. Especifique múltiplos PIDs com vírgulas.

$ sudo lsof -p 24531,800

Você também pode filtrar por usuário 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 é uma correspondência OU (qualquer um deles). Para exigir todas as condições (E), adicione -a.

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

Quem Está Usando Este Arquivo?

Conclusão: lsof /caminho faz busca reversa dos processos que têm um arquivo (ou diretório) aberto. É a solução para "device is busy" ao desmontar.

Todo mundo já encontrou target is busy ao tentar desmontar um drive USB. A causa é simples: algo tem um arquivo naquele diretório aberto.

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

Para buscar em uma árvore de diretórios recursivamente, use +D.

$ sudo lsof +D /mnt/usb

Tendo o PID, encerre o processo ou faça-o sair do diretório, e a desmontagem terá 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)

Forçar encerramento é último recurso. Verifique quais são os processos (sem -t) primeiro.

Deletei um Arquivo mas o Disco Ainda Está Cheio

Conclusão: Deletar um arquivo que um processo ainda tem aberto não libera o espaço até o processo encerrar. Use lsof | grep deleted para encontrar o responsável.

"Eu dei rm em um log enorme mas df não mostra espaço extra livre" é uma armadilha clássica. Enquanto algum processo tiver o arquivo aberto, rm só remove o link; os dados reais (inode) permanecem até 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 espaço aqui, você deve reiniciar o processo (ou fechar o fd causador). rm huge.log sozinho claramente não é suficiente.

Para arquivos de log de serviços, prefira rotação (logrotate com copytruncate) ou truncate -s 0 ao invés de rm. Um rm simples facilmente cria esse estado de deletado-mas-aberto.

Tabela de Referência de Opções Comuns

Conclusão: Comece por um dos três 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 usuário lsof -u <user>
Processo usando um arquivo lsof /caminho/para/arquivo
Buscar recursivamente em diretório lsof +D /caminho
Arquivos deletados mas abertos lsof -nP | grep '(deleted)'
Saída somente PID (encadear com kill) lsof -t /caminho

Templates de investigação 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)'

Próximas Leituras