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 lsof só mostra arquivos acessíveis ao seu usuário.
  • Use -P -n para 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 lsof depende 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: Substitui netstat para informações de socket, mais rápido que lsof para rede.
  • netstat: Clássico, ainda disponível (netstat -tulpn).
  • /proc: Acesso direto ao pseudo-sistema de arquivos (cat /proc/PID/fd/*).

Referências