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