Resolução de Conflitos de Porta: Liberando Processos Travados com lsof e kill
O erro de porta em uso (“Address already in action”) é uma constante no cotidiano de desenvolvedores e administradores de sistemas quando aplicações não encerram corretamente. Combinar os utilitários lsof e kill permite identificar exatamente qual processo está prendendo um socket de rede específico e encerrá-lo imediatamente para liberar a porta.
Bash
#!/bin/bash
# Script para identificar e matar o processo que está ocupando uma porta específica
PORTA_ALVO=8080
echo "=== Verificando processos na porta $PORTA_ALVO ==="
# 1. Busca o PID (Process ID) associado à porta informada
PID=$(lsof -t -i:$PORTA_ALVO)
# 2. Verifica se algum processo foi encontrado antes de tentar encerrá-lo
if [ -n "$PID" ]; then
echo "Processo encontrado rodando no PID: $PID"
# 3. Envia o sinal SIGTERM (15) para encerramento gracioso
kill -15 $PID 2>/dev/null
sleep 1
# 4. Força o encerramento com SIGKILL (9) caso o processo ainda persista
if kill -0 $PID 2>/dev/null; then
echo "O processo não respondeu ao SIGTERM. Forçando encerramento (SIGKILL)..."
kill -9 $PID
fi
echo "Porta $PORTA_ALVO liberada com sucesso!"
else
echo "Nenhum processo ativo encontrado na porta $PORTA_ALVO."
fi
Exemplo de uso prático no terminal:
Bash
# Executando comando direto em linha única para matar rapidamente
kill -9 $(lsof -t -i:8080)
Pontos-chave
- O Parâmetro
-tdolsof: A flag terse (-t) força o comando a retornar apenas o número do PID do processo, facilitando o encadeamento direto em scripts e rotinas. - Sinais de Finalização (
-15vs-9): Dê preferência a utilizar primeiro o sinalSIGTERM(-15) para permitir que a aplicação feche conexões de forma limpa; useSIGKILL(-9) somente se o processo travar e recusar o encerramento. - Permissões de Execução (
sudo): Para monitorar ou matar processos pertencentes a outros usuários ou serviços de sistema (como portas abaixo de 1024), execute o comando com privilégios de superusuário (sudo lsof). - Sintaxe do Protocolo: É possível restringir a busca por protocolo específico adicionando a camada de transporte ao comando
lsof(ex:lsof -i tcp:8080oulsof -i udp:53). - Verificação sem Interrupção (
kill -0): O comandokill -0 $PIDnão finaliza a aplicação; ele apenas testa se o ID do processo ainda existe e está ativo na memória.
