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 kill
equipe tem vários parentes próximos. O comando pkill
matará o processo pelo nome e killall
matará 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 socat
para criar conexões de rede usando protocolos diferentes. Você precisará instalar socat
. Para instalá-lo no Ubuntu, use este comando:
sudo apt install socat
No Fedora use dnf
:
sudo dnf install socat
No Manjaro você precisa digitar:
sudo pacman -S socat
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 &
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 &
Uso de assassinato
Claro que podemos usar kill
para encerrar um processo se soubermos o id do processo. Para encontrar o PID podemos usar lsof
o comando.
Para listar os detalhes do processo na porta 7889, que utiliza o protocolo TCP, usamos a -i
opção (endereço de internet), conforme mostrado aqui.
lsof -i tcp:7889
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 lsof
para um awk
comando awk
para 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}'
Podemos então canalizar a saída awk
para kill
o comando usando xargs
. Um comando xargs
recebe a entrada por meio de um pipeline e a passa para outro comando como parâmetros de linha de comando. Vamos usar xargs
com kill
a equipe.
lsof -i tcp:7889 | awk '/7889/{print $2}' | xargs 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 lsof
novamente.
lsof -i tcp:7889
Como lsof
nã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
No entanto, lsof
ele não reconhece o protocolo SCTP.
lsof -i sctp:7889
Podemos usar um ss
comando para fazer isso. Usamos a -S
opção (SCTP) para procurar sockets SCTP, a -a
opção (todos) para buscar todos os tipos de sockets (escutando, recebendo, conectado, etc.), e a -p
opção (processos) para listar informações sobre o processo usando o soquete.
ss -Sap
Podemos analisar essa saída usando grep
e awk
. Também poderíamos analisá-lo com grep
algumas 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 ss
para grep
e encontraremos nosso número de porta, 7889. Enviaremos a saída de grep
para awk
. Em awk
, usamos -F
a 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}'
Isso nos deu a string “pid=2859”.
Podemos passar isso awk
novamente, 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}'
Agora isolamos o ID do processo. Podemos usar xargs
para passar o PID como kill
um parâmetro de linha de comando.
ss -Sap | grep "7889"| awk -F',' '/pid=/{print $2}' | awk -F'=' '{print $2}' | xargs kill
Isso mata o processo que estava usando o soquete do protocolo SCTP na porta 7889.
Equipe do fusor
O comando fuser
simplifica 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 fuser
já foi instalado nas máquinas Ubuntu, Fedora e Manjaro que testamos.
Tudo o que você precisa fazer é usar a -k
opção (kill) e especificar a porta e o protocolo. Você pode usar -n
a 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
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