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 busyao 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
sudoe-n -P
Pré-requisitos
- SO: Ubuntu / baseado em RHEL (
lsofpode ser um pacote separado) - Se ausente:
sudo apt install lsof/sudo dnf install lsof - Você precisa de
sudopara 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 donoFD: 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 :PORTidentifica 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 comohttp(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 /caminhofaz 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 deletedpara 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 -Pe 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)'