Como matar um processo Linux pelo número da porta

Publicados: 2022-10-08
Laptop Linux mostrando um prompt bash
fatmawati achmad zaenuri/Shutterstock.com

Para matar um processo Linux, você precisa de seu ID ou nome. Se tudo o que você sabe é a porta que está usando, você ainda pode matá-la? Sim, de várias maneiras diferentes.

Processos de morte

Ocasionalmente, um processo do Linux pode parar de responder. Ele pode parar de funcionar corretamente ou pode continuar a funcionar, mas ignorar solicitações de desligamento ou começar a devorar memória, CPU ou largura de banda da rede.

Como matar processos do terminal Linux
RELACIONADO Como matar processos do terminal Linux

Quaisquer que sejam seus motivos, existem maneiras de matar um processo a partir da linha de comando do Linux. O método clássico é usar o comando kill com o ID do processo que você deseja encerrar. O comando kill tem alguns parentes próximos. O comando pkill matará um processo pelo nome e killall matará todos os processos que encontrar que compartilham parte de um nome.

Se tudo o que você sabe sobre um processo é que ele está usando uma porta em seu computador, ainda existem maneiras de identificá-lo e eliminá-lo. Em termos de rede, “porta” pode significar uma conexão física na qual você insere um cabo com um plugue na extremidade, como um cabo de rede CAT5 ou 6, ou pode significar uma porta de software.

Uma porta de software é a parte final de uma conexão de rede. O endereço IP de um dispositivo identifica o computador ou outro dispositivo de rede. Os aplicativos dentro do computador usam portas diferentes. Estes fornecem outro nível de granularidade. O tráfego de rede chegou ao computador correto usando o endereço IP e, usando o endereçamento de porta, ele pode ser entregue ao aplicativo correto.

É como o correio postal que chega a um hotel, depois é classificado e entregue nos quartos apropriados. O endereço IP é como o endereço do hotel, e os números dos quartos são como os números das portas.

Se você vir atividade de rede em uma porta e não reconhecer o processo que a está gerando, ou seu comportamento for problemático ou suspeito, talvez queira encerrar o processo. Mesmo que tudo o que você saiba seja o número da porta, você pode rastrear o processo e eliminá-lo.

Criando conexões com socat

Para que tenhamos algumas conexões para matar, usaremos socat para criar conexões de rede usando diferentes protocolos. Você precisará instalar socat . Para instalá-lo no Ubuntu, use este comando:

 sudo apt instalar socat 

Instalando o socat no Ubuntu

No Fedora, use dnf :

 sudo dnf instalar socat 

Instalando o socat no Fedora

No Manjaro você precisa digitar:

 sudo pacman -S socat 

Instalando o socat no Manjaro

A sintaxe para socat é direta, embora um pouco prolixa. Precisamos fornecer os endereços de origem e destino. Para cada um deles, precisamos fornecer o protocolo, o endereço IP e o número da porta. Podemos substituir STDIN ou STDOUT como origem ou destino.

Este comando cria uma conexão entre um soquete de escuta TCP na porta 7889, no endereço IP de loopback de 127.0.0.1 e STDOUT. O e comercial “ & ” executa o comando em segundo plano, para que possamos manter o acesso à linha de comando.

 socat tcp-listen:7889,bind=127.0.0.1 stdout & 

Criando uma conexão de soquete TCP de escuta com socat

Criaremos mais duas conexões para que tenhamos uma pequena seleção de soquetes usando protocolos diferentes. Criaremos uma conexão UDP e uma conexão SCTP. A única parte do comando que muda é o protocolo.

 socat udp-listen:7889,bind=127.0.0.1 stdout &
 socat sctp-listen:9999,bind=127.0.0.1 stdout & 

Criando conexões de soquete UDP e SCTP de escuta com socat

RELACIONADO: Qual é a diferença entre TCP e UDP?

Usando Matar

Claro, podemos usar kill para encerrar o processo, contanto que saibamos qual é o ID do processo. Para encontrar o PID, podemos usar o comando lsof .

Para listar os detalhes do processo na porta 7889 que está usando o protocolo TCP, usamos a opção -i (endereço de internet), assim.

 lsof -i tcp:7889 

Usando lsof para mostrar os detalhes de um processo usando uma porta e protocolo específicos

O PID deste processo é 3141, e podemos usar isso com kill :

 sudo matar 3141

Podemos poupar algum esforço se usarmos cachimbos. Se canalizarmos a saída de lsof para o awk e dissermos ao awk para procurar linhas que contenham a porta em que estamos interessados ​​— 7889 — e imprimir o segundo campo dessa linha, isolaremos o PID.

 lsof -i tcp:7889 | awk '/7889/{print $2}' 

Encaminhando a saída de lsof para awk

Podemos então canalizar a saída do awk para o comando kill usando xargs . O comando xargs pega sua entrada canalizada e a passa para outro comando como parâmetros de linha de comando. Usaremos xargs com o comando kill .

 lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs matam 

Usando pipes para levar a saída de lsof para awk e de awk para xargs e matar

Não recebemos nenhum feedback visual. Do jeito típico do Linux, nenhuma notícia é uma boa notícia. Se você quiser verificar se o processo foi finalizado, você pode usar lsof mais uma vez.

 lsof -i tcp:7889 

Usando lsof para procurar detalhes de um processo usando uma porta e protocolo específicos sem sucesso

Como o lsof não relata nada, sabemos que não existe essa conexão.

Podemos remover um processo usando o protocolo UDP simplesmente substituindo “tcp” por “udp” em nosso comando anterior.

 lsof -i udp:7889 | awk '/7889/{print $2}' | xargs matam 

Usando pipes para levar a saída de lsof para awk e de awk para xargs e kill, para um soquete UDP

No entanto, lsof não reconhece o protocolo SCTP.

 lsof -i sctp:7889 

lsof não funciona com o protocolo SCTP

Podemos usar o comando ss para fazer isso. Estamos usando a opção -S (SCTP) para procurar soquetes SCTP, a opção -a (todos) para procurar todos os tipos de soquetes (escutando, aceitando, conectado, etc.) e a opção -p (processos) para listar os detalhes do processo usando o soquete.

 ss -Sap 

Imprimindo os detalhes de um processo usando um soquete SCTP com ss

Podemos analisar essa saída usando grep e awk . Também poderíamos analisá-lo usando grep e alguns regexes PERL, mas dessa forma é muito mais fácil de entender. Se você fosse usar isso mais de uma ou duas vezes, provavelmente faria um alias ou uma função de shell com isso.

Encaminharemos a saída de ss para grep e procuraremos nosso número de porta, 7889. Encaminharemos a saída de grep para awk . Em awk , estamos usando a opção -F (separator string) para definir uma vírgula “ , ” como delimitador de campo. Procuramos uma string contendo “pid=" e imprimimos o segundo campo delimitado por vírgulas dessa string.

 ss-Sap | grep "7889" | awk -F',' '/pid=/{print $2}' 

Usando pipes para conectar ss, grep e awk para extrair a string PID

Isso nos deu a string “pid=2859”.

Podemos canalizar isso para o awk novamente, definir o delimitador de campo para o sinal de igual “ = ” e imprimir o segundo campo dessa string, que será o texto por trás do sinal de igual.

 ss-Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' 

Usando pipes para conectar ss, grep e awk duas vezes, para extrair o PID

Agora isolamos o ID do processo. Podemos usar xargs para passar o PID para kill como um parâmetro de linha de comando.

 ss-Sap | grep "7889" | awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs matam 

Usando pipes com ss, grep, awk e xargs para encerrar um processo de soquete SCTP

Isso mata o processo que estava usando o soquete do protocolo SCTP na porta 7889.

O comando do fusor

O comando fuser simplifica bastante as coisas. A desvantagem é que ele só funciona com soquetes TCP e UDP. No lado positivo, esses são os dois tipos mais comuns de soquetes com os quais você precisará lidar. O comando fuser já estava instalado nos computadores Ubuntu, Fedora e Manjaro que verificamos.

Tudo o que você precisa fazer é usar a opção -k (kill) e fornecer a porta e o protocolo. Você pode usar a opção -n (namespace) e fornecer o protocolo e a porta, ou usar o "formato de atalho de barra" e colocar o número da porta primeiro.

 fusor -n tcp 7889
 fusor 7889/udp 

Usando o comando fuser para excluir os processos usando soquetes TCP e UDP

O número da porta, protocolo e PID do processo finalizado são impressos na janela do terminal.

Experimente o fusor primeiro

Ele provavelmente será instalado no computador em que você está trabalhando e o protocolo provavelmente será TCP ou UDP, então há uma grande chance de que a maneira mais simples funcione para você.