Como matar um processo Linux pelo número da porta

Como matar um processo Linux pelo número da porta

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

Matar processos

Às vezes, um processo do Linux pode parar de responder. Ele pode parar de funcionar corretamente ou continuar funcionando, mas ignorar solicitações para desativá-lo ou começar a consumir memória, CPU ou largura de banda da rede.

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 matar. A killequipe tem vários parentes próximos. O comando pkillmatará o processo pelo nome e killallmatará todos os processos que encontrar que compartilhem parte do 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ê conecta um cabo com um plugue na extremidade, como um cabo de rede CAT5 ou 6 , ou pode significar uma porta de software.

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

Isso é semelhante a como o correio postal chega a um hotel, é então classificado e entregue nos quartos apropriados. Um endereço IP é como o endereço de um 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á criando, ou se seu comportamento estiver causando problemas ou suspeitas, você pode querer matar esse processo. Mesmo que tudo o que você saiba seja o número da porta, você pode rastrear o processo e eliminá-lo.

Fazendo conexões com socat

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

sudo apt install socat

Instalando o socket no Ubuntu

No Fedora use dnf:

sudo dnf install socat

Instalando o socket no Fedora

No Manjaro você precisa digitar:

sudo pacman -S socat

Instalando o suco no Manjaro

A sintaxe socaté simples, embora um pouco detalhada. Precisamos especificar os endereços de origem e destino. Para cada um deles, precisamos especificar 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, um endereço IP de loopback de 127.0.0.1 e STDOUT. O e comercial ” &” executa o comando em segundo plano, portanto, mantemos 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. Vamos criar 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 escuta de soquete UDP e SCTP com socat

Uso de assassinato

Claro que podemos usar killpara encerrar um processo se soubermos o id do processo. Para encontrar o PID podemos usar lsofo comando.

Para listar os detalhes do processo na porta 7889, que utiliza o protocolo TCP, usamos a -iopção (endereço de internet), conforme mostrado aqui.

lsof -i tcp:7889

Usando lsof para exibir detalhes de um processo usando uma porta e protocolo específicos.

O PID deste processo é 3141 e podemos usá-lo com kill:

sudo kill 3141

Podemos economizar algum esforço se usarmos tubos. Se direcionarmos a saída lsofpara um awkcomando awkpara procurar linhas contendo a porta que nos interessa – 7889 – e imprimir o segundo campo desta linha, isolamos o PID.

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

Saída de lsof para awk

Podemos então canalizar a saída awkpara killo comando usando xargs. Um comando xargsrecebe a entrada por meio de um pipeline e a passa para outro comando como parâmetros de linha de comando. Vamos usar xargscom killa equipe.

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

Usando pipes para canalizar a saída lsof para awk e de awk para xargs e kill

Não recebemos nenhum feedback visual. Na moda típica do Linux, nenhuma notícia é uma boa notícia. Se você quiser ter certeza de que o processo foi concluído, você pode usar lsofnovamente.

lsof -i tcp:7889

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

Como lsofnão informa 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 kill

Usando pipes para canalizar a saída lsof para o awk e do awk para o xargs e matar para o soquete UDP

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

lsof -i sctp:7889

lsof não funciona com protocolo SCTP

Podemos usar um sscomando para fazer isso. Usamos a -Sopção (SCTP) para procurar sockets SCTP, a -aopção (todos) para buscar todos os tipos de sockets (escutando, recebendo, conectado, etc.), e a -popção (processos) para listar informações sobre o processo usando o soquete.

ss -Sap

Detalhes do processo de impressão usando soquete SCTP com ss

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

Enviaremos a saída de sspara grepe encontraremos nosso número de porta, 7889. Enviaremos a saída de greppara awk. Em awk, usamos -Fa opção (separator string) para definir uma vírgula ” ,” como separador de campo. Procuramos uma linha contendo “pid=” e imprimimos o segundo campo delimitado por vírgulas dessa linha.

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

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

Isso nos deu a string “pid=2859”.

Podemos passar isso awknovamente, definir o separador de campo para o sinal de igual ” =” e imprimir o segundo campo dessa linha, que será o texto atrá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 xargspara passar o PID como killum parâmetro de linha de comando.

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

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.

Equipe do fusor

O comando fusersimplifica muito o trabalho. A desvantagem é que ele só funciona com soquetes TCP e UDP. No lado positivo, esses são os dois tipos de soquete mais comuns com os quais você precisará lidar. O comando fuserjá foi instalado nas máquinas Ubuntu, Fedora e Manjaro que testamos.

Tudo o que você precisa fazer é usar a -kopção (kill) e especificar a porta e o protocolo. Você pode usar -na opção (namespace) e especificar o protocolo e a porta, ou usar “slash label format” e especificar primeiro o número da porta.

fuser -n tcp 7889 fuser 7889/udp

Usando o comando fuser para matar processos usando soquetes TCP e UDP

O número da porta, protocolo e PID do processo concluído 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, portanto, há uma boa chance de que a maneira mais fácil funcione para você.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *