Guia Completo do lsof no Linux - Dicas Práticas Essenciais de Conflito de Portas à Liberação de Espaço de Arquivos Excluídos

Visão Geral

Problemas que surgem durante a administração de sistemas Linux, como “conflitos de portas” ou “espaço em disco que não diminui mesmo após exclusões”, podem ser resolvidos imediatamente com o comando lsof. Neste artigo, exploramos técnicas essenciais para aplicar diretamente o lsof na prática em ambientes Linux, onde tudo é tratado como arquivo. Veja o passo a passo com o conhecimento prático indispensável para engenheiros de sistemas, desde o rastreamento de portas até a liberação de bloqueios de arquivos.

Verificação Básica do lsof e Inspeção de Arquivos Abertos por Usuários/Processos Específicos

Para verificar se o comando lsof está instalado no sistema e, caso não esteja, instalar o pacote correspondente, execute o comando command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof).

command -v lsof >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y lsof)

Execute o comando lsof -v para verificar a versão instalada e as informações de build do comando lsof.
⚙️ [Principais Opções]

-u : Consulta a lista de arquivos e processos abertos por uma conta de usuário específica.
-c : Filtra a lista de arquivos abertos por processos que começam com o nome especificado.
-p : Verifica a lista de arquivos abertos por um ID de processo (PID) específico.
-i : Consulta sockets de rede e processos que utilizam portas específicas.
+D : Pesquisa recursivamente a lista de arquivos abertos no diretório especificado e em seus subcaminhos.
-t : Exibe de forma concisa apenas os IDs de processo (PID), um por linha, útil para integração com scripts.

lsof -v

Execute o comando mkdir -p /tmp/lsof_lab && echo '테스트 파일 내용' > /tmp/lsof_lab/sample.txt para preparar um diretório de teste e um arquivo de exemplo para as práticas com o lsof.

mkdir -p /tmp/lsof_lab && echo ‘테스트 파일 내용’ > /tmp/lsof_lab/sample.txt

Execute o comando tail -f /tmp/lsof_lab/sample.txt & em segundo plano para manter o arquivo de exemplo gerado aberto por um processo.

tail -f /tmp/lsof_lab/sample.txt &

O comando lsof -u $(whoami) | head -n 15 lista as primeiras 15 linhas dos arquivos ocupados pelos processos em execução pelo usuário atualmente conectado.
É possível verificar detalhes dos arquivos abertos pela conta atual, incluindo bibliotecas básicas do sistema e arquivos executáveis.

lsof -u $(whoami) | head -n 15

O comando lsof -c tail pesquisa e exibe a lista de arquivos e bibliotecas abertos por processos cujo nome é tail.
Com isso, você pode conferir quais descritores de arquivo e bibliotecas compartilhadas o comando tail executado em segundo plano está referenciando.

lsof -c tail

Após concluir a prática, execute o comando killall tail 2>/dev/null || true para encerrar e limpar com segurança o processo tail em execução em segundo plano.

killall tail 2>/dev/null || true

Diagnóstico de Portas de Rede e Resolução de Conflitos de Processos

Para preparar o ambiente de prática de verificação de portas e conflitos de processos, verifique se o python3 está instalado no sistema e instale o pacote caso não esteja.

command -v python3 >/dev/null 2>&1 || (apt-get update -qq && apt-get install -y python3)

Inicie um servidor web simples em segundo plano na porta 8080 para testar a ocupação de portas de rede.

python3 -m http.server 8080 >/dev/null 2>&1 &

Aguarde 1 segundo até que o processo do servidor web iniciado em segundo plano seja vinculado com sucesso à porta 8080.

sleep 1

O comando lsof -i :8080 consulta os processos que estão utilizando a porta 8080.
Por meio do resultado, é possível confirmar que o processo python3 com PID 371 está aguardando em estado LISTEN na porta 8080.

lsof -i :8080

O comando lsof -i -P -n | head -n 15 exibe rapidamente a lista de sockets de rede do sistema em formato numérico, sem conversão de números de porta e endereços IP.
Como omite a resolução reversa de DNS e o mapeamento de nomes de portas de serviço, permite identificar o status de ocupação das portas de forma rápida e sem atrasos.

lsof -i -P -n | head -n 15

O comando lsof -i TCP:8080 -sTCP:LISTEN filtra e exibe com precisão apenas as conexões na porta 8080 que utilizam o protocolo TCP e estão no estado LISTEN.
É muito útil para excluir conexões de sessão desnecessárias e identificar com exatidão apenas os processos daemon que estão efetivamente aguardando conexões nessa porta.

lsof -i TCP:8080 -sTCP:LISTEN

Após concluir a prática, encerre forçadamente o processo do servidor web em segundo plano que estava ocupando a porta TCP 8080 para liberar os recursos ocupados.

fuser -k 8080/tcp 2>/dev/null || kill $(lsof -t -i :8080) 2>/dev/null || true

Rastreamento de Diretórios Específicos e Arquivos que Impedem a Desmontagem (Device Busy)

Para reproduzir uma situação de diretório ocupado e impedimento de desmontagem, crie um diretório de teste e navegue até esse caminho.

mkdir -p /tmp/mount_test && cd /tmp/mount_test

Execute o comando echo '작업 중인 파일' > active_work.log para criar o arquivo de log de destino que será mantido aberto por um processo.

echo ‘작업 중인 파일’ > active_work.log

Execute o processo sleep em segundo plano para referenciar continuamente o arquivo criado através da entrada padrão.

sleep 30 < active_work.log &

Mude o diretório de trabalho para o diretório base (home) para inspecionar o status fora do diretório ocupado.

cd /root || cd ~

O comando lsof +D /tmp/mount_test rastreia e exibe recursivamente todos os arquivos e processos abertos no diretório especificado e em seus subcaminhos.
Pela saída gerada, é possível confirmar que o processo sleep de PID 450 referencia esse diretório como seu diretório de trabalho atual (cwd) e mantém o arquivo active_work.log aberto em modo de leitura (0r), sendo a causa que impede a desmontagem.

lsof +D /tmp/mount_test

Após concluir a prática, encerre com segurança o processo sleep em segundo plano que estava ocupando o diretório e o arquivo.

killall sleep 2>/dev/null || true

Exclua o diretório temporário de testes e todos os seus subarquivos utilizados na prática para liberar os recursos do sistema.

rm -rf /tmp/mount_test

Recuperação e Limpeza de Arquivos Fantasmas (deleted) Excluídos mas Ocupando Espaço em Disco

Para testar o vazamento de espaço em disco, crie um diretório de teste e gere um arquivo grande de 10 MB.

mkdir -p /tmp/leak_test && dd if=/dev/zero of=/tmp/leak_test/large.img bs=1M count=10 >/dev/null 2>&1

Monitore o arquivo em segundo plano para que um processo continue mantendo o handle do arquivo de grande porte gerado.

tail -f /tmp/leak_test/large.img &

Exclua forçadamente o arquivo grande ocupado no sistema de arquivos para reproduzir a situação de retenção por arquivo fantasma.

rm -f /tmp/leak_test/large.img

O comando lsof | grep '(deleted)' | head -n 5' consulta a lista de arquivos que foram excluídos do sistema de arquivos, mas continuam abertos por processos e ocupando espaço em disco.
Com isso, é possível rastrear rapidamente os arquivos fantasmas e os respectivos processos cujo espaço em disco não foi liberado mesmo após a exclusão com o comando rm.

lsof | grep ‘(deleted)’ | head -n 5

Com base no ID do processo extraído através do lsof -t, consulte a lista de descritores de arquivos no diretório /proc/$TARGET_PID/fd/.
Ao verificar diretamente o número do descritor de arquivo referenciado pelo processo, você pode truncar o espaço sem reiniciar o processo ou, se necessário, recuperar os dados originais excluídos por meio desse descritor.

TARGET_PID=$(lsof -t /tmp/leak_test/large.img 2>/dev/null | head -n 1) && [ -n “$TARGET_PID” ] && ls -l /proc/$TARGET_PID/fd/ || true

Após concluir a prática, encerre com segurança o processo em segundo plano que mantinha o arquivo fantasma ocupado para liberar totalmente o espaço em disco.

killall tail 2>/dev/null || true

Exclua completamente o diretório de testes temporário utilizado na prática para organizar os recursos do sistema.

rm -rf /tmp/leak_test

Até aqui, exploramos de forma prática as principais dicas de uso do comando lsof, desde a resolução de conflitos de portas até a recuperação de espaço em disco de arquivos excluídos.
Esperamos que este conteúdo seja de grande ajuda na resolução de problemas durante a administração real de servidores e tarefas de troubleshooting.