Como usar lsof para identificar processos usando arquivos e portas
1. Introdução ao lsof: O canivete suíço da inspeção de processos
O comando lsof (List Open Files) é uma ferramenta essencial na caixa de ferramentas de qualquer administrador de sistemas Unix/Linux. Sua importância deriva diretamente da filosofia Unix: tudo é um arquivo. Sockets de rede, pipes, dispositivos de bloco, diretórios e arquivos regulares — todos são tratados como descritores de arquivo pelo kernel.
O lsof permite listar todos esses descritores abertos, fornecendo informações cruciais sobre qual processo está usando qual recurso. Isso é fundamental para diagnóstico de problemas como portas ocupadas, arquivos bloqueados, sistemas de arquivos que não podem ser desmontados e investigação de conexões suspeitas.
Para instalar o lsof na maioria das distribuições Linux:
# Debian/Ubuntu
sudo apt-get install lsof
# RHEL/CentOS/Fedora
sudo yum install lsof
# Verificar versão
lsof --version
A saída típica de lsof --version mostra informações como:
lsof version 4.95
latest revision: 2022-06-30
2. Sintaxe básica e opções fundamentais
A estrutura geral do comando é:
lsof [opções] [filtros]
As opções mais importantes são:
| Flag | Descrição |
|---|---|
-i |
Filtra por conexões de rede (portas, protocolos, hosts) |
-u |
Filtra por nome ou UID de usuário |
-p |
Filtra por PID (Process ID) |
-c |
Filtra por nome do comando |
-P |
Desabilita resolução de nomes de porta (mostra números) |
-n |
Desabilita resolução de DNS |
Exemplo combinando opções:
lsof -i :80 -u www-data
Este comando lista todos os arquivos abertos por processos do usuário www-data que estão associados à porta 80.
3. Identificando processos que usam portas específicas
O caso de uso mais comum do lsof é descobrir qual processo está usando uma porta específica. Por exemplo, se você tentar iniciar um servidor web na porta 8080 e receber um erro "port already in use":
sudo lsof -i :8080
Saída típica:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 1234 joao 56u IPv4 12345 0t0 TCP *:8080 (LISTEN)
Para listar apenas processos que estão escutando (em modo LISTEN) em portas TCP:
sudo lsof -iTCP -sTCP:LISTEN
Para obter uma visão limpa de todas as conexões ativas, sem resolução de nomes:
sudo lsof -i -P -n
A opção -P evita a conversão de números de porta para nomes (como 80 → http), e -n evita consultas DNS, tornando a saída muito mais rápida e clara.
4. Descobrindo qual processo está usando um arquivo específico
Muitas vezes você precisa saber qual processo está segurando um arquivo. Por exemplo, ao tentar desmontar um sistema de arquivos ou modificar um arquivo de log:
sudo lsof /var/log/syslog
Saída:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1234 syslog 2w REG 8,1 1234567 12345 /var/log/syslog
Para encontrar arquivos deletados mas ainda abertos (que ocupam espaço em disco):
sudo lsof +L1
Esta opção lista arquivos cujo link count é 1 ou menos (ou seja, foram deletados do diretório mas ainda estão abertos por algum processo).
Caso prático: Liberar um diretório que não pode ser desmontado
# Tentativa de desmontar falha
sudo umount /mnt/disco
# umount: /mnt/disco: target is busy
# Descobrir o que está usando o diretório
sudo lsof +D /mnt/disco
# Matar o processo ou fechar o arquivo
kill -9 [PID]
5. Filtros avançados por usuário, PID e comando
O lsof oferece filtros poderosos para isolar processos específicos:
Por usuário:
# Listar arquivos abertos por um usuário específico
lsof -u joao
# Excluir processos do root
lsof -u ^root
Por PID:
# Ver todos os arquivos abertos por um processo específico
lsof -p 1234
Por nome do comando:
# Ver arquivos abertos por todos os processos nginx
lsof -c nginx
# O -c aceita expressões regulares simples
lsof -c '^systemd'
6. Modos de saída e personalização de colunas
As colunas padrão do lsof são:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- COMMAND: Nome do comando
- PID: ID do processo
- USER: Proprietário do processo
- FD: Descritor de arquivo (cwd, rtd, txt, mem, número, etc.)
- TYPE: Tipo (REG, DIR, CHR, IPv4, IPv6, etc.)
- DEVICE: Número do dispositivo
- SIZE/OFF: Tamanho ou offset
- NODE: Número do inode
- NAME: Caminho do arquivo ou detalhes da conexão
Para processamento com scripts, use o modo de lista (-F):
lsof -F pcfn -i :80
Isso gera saída no formato:
p1234
cnginx
f/var/log/nginx/access.log
n/var/log/nginx/access.log
Outras opções úteis:
# Suprimir avisos
lsof -w
# Forçar resolução de caminhos em sistemas de arquivos especiais
lsof +f
7. Casos de uso reais e resolução de problemas
Caso 1: Porta ocupada — identificando e matando o processo conflitante
# Você tenta iniciar o Apache na porta 80
sudo systemctl start apache2
# Falha: Address already in use
# Descobrir o culpado
sudo lsof -i :80
# Saída mostra nginx rodando na porta 80
# Opção: parar o nginx
sudo systemctl stop nginx
# Ou matar diretamente (último recurso)
sudo kill -9 [PID]
Caso 2: Arquivo corrompido ou bloqueado
# Um arquivo de banco de dados SQLite não pode ser acessado
# Descobrir quem está usando
sudo lsof /var/lib/sqlite/meu_banco.db
# Saída mostra um processo Python com o arquivo aberto
# Fechar o aplicativo ou matar o processo
Caso 3: Monitoramento de conexões suspeitas
# Listar todas as conexões estabelecidas
sudo lsof -i -n -P | grep ESTABLISHED
# Filtrar por IP externo suspeito
sudo lsof -i -n -P | grep "192.168.1.100"
8. Boas práticas, limitações e alternativas
Boas práticas:
- Execute como root para visibilidade completa. Sem privilégios, o
lsofsó mostra arquivos acessíveis ao seu usuário. - Use
-P -npara evitar lentidão por resolução de nomes. - Combine filtros para reduzir o ruído:
lsof -i :22 -u ^root -c sshd
Limitações:
- O
lsofdepende do sistema de arquivos/proc; em containers muito restritos, pode não funcionar completamente. - Não atravessa fronteiras de containers Docker/LXC por padrão (precisa executar dentro do container).
- Sistemas de arquivos remotos (NFS, FUSE) podem ter comportamento imprevisível.
Alternativas complementares:
fuser: Mais simples, foca em arquivos e portas específicos (fuser 80/tcp,fuser -v /caminho).ss: Substituinetstatpara informações de socket, mais rápido quelsofpara rede.netstat: Clássico, ainda disponível (netstat -tulpn)./proc: Acesso direto ao pseudo-sistema de arquivos (cat /proc/PID/fd/*).
Referências
- Documentação oficial do lsof (man page) — Página de manual completa com todas as opções e flags do comando lsof.
- Linux lsof Command Examples (HowtoForge) — Tutorial prático com exemplos reais de uso do lsof para solução de problemas.
- Using lsof to Find Open Files (Red Hat Customer Portal) — Artigo técnico da Red Hat sobre identificação de arquivos abertos com lsof.
- lsof Tutorial: 15 Practical Examples (The Geek Stuff) — Guia com 15 exemplos práticos do comando lsof para administração de sistemas.
- Understanding lsof Output (Baeldung) — Explicação detalhada de cada coluna da saída do lsof e como interpretar os resultados.