Mate qualquer serviço em execução em uma porta específica

13

Estou tentando escrever um script que mata o serviço em execução em uma porta específica. Este é o meu script:

a=$(ps ax | grep 4990 | grep java | awk '{print $1}')
kill -9 $a

É um programa java. Às vezes, esse script funciona, mas misteriosamente falha na maioria das vezes.

Existe alguma outra maneira de matar um serviço em execução em uma porta? Minha porta está 4990.

Abhishek dot py
fonte
Seu script também mataria os processos Java rodando em outros animais de estimação como 14990.
roaima

Respostas:

32

Você pode tentar fuser:

fuser -k 4990/tcp

Ou use lsofpara obter o ID do processo e, em seguida, alimente para kill:

kill $(sudo lsof -t -i:4990)
cuonglm
fonte
Devo ter que substituir o tcp por java?
Abhishek dot py
@Abhishekdotpy: Não, use tcp.
cuonglm
Obrigado por essa -tbandeira, eu preciso disso há tanto tempo.
6266 Jackson
Você poderia dar uma dica sobre como passar corretamente a última linha para o ssh?
Vladimir Protsenko 5/09/19
@VladimirProtsenko você pode fornecer mais contexto?
cuonglm
4

Se você deseja eliminar qualquer serviço ou processo em execução na porta número 8080, primeiro você precisa encontrar o número de identificação do processo da porta 8080 (PID) e depois matá-lo. Execute o seguinte comando para localizar o PID do número da porta 8080:

sudo lsof -t -i:8080

Aqui,

  • sudo - comando para solicitar privilégios de administrador (ID do usuário e senha).
  • lsof - lista de arquivos (também usado para listar processos relacionados)
  • -t - mostra apenas o ID do processo
  • -i - mostra apenas o processo relacionado às conexões com a Internet
  • : 8080 - mostra apenas processos neste número de porta

Agora você pode facilmente matar seu PID usando o seguinte comando:

sudo kill -9 <PID>

Aqui,

  • kill - comando para matar o processo
  • -9 - com força

Você pode usar um comando para matar um processo em uma porta específica usando o seguinte comando:

sudo kill -9 $(sudo lsof -t -i:8000)

Para mais, você pode ver o seguinte link Como matar um processo em uma porta específica no Linux

Mahfuz
fonte
Usar não kill -9dá ao processo de destino a oportunidade de arrumar. Considere usar simples kill, pelo menos inicialmente.
roaima
1
<?php
  $port = $argv[1]; 
  if(!empty($port) && is_numeric($port) ){
  $pid = trim(shell_exec("lsof -t -i:".$port));
  if(!empty($pid)){
     shell_exec("sudo kill -9 ".$pid);
     echo "pid : ".$pid."  killed which is listened port : ".$port."\xA";
  }
  else{
     echo " [X] no such process found for pid : ".$port."\xA";
  }
  }
  else{ 
     echo " invalid pid \xA";
  }
?>
  1. criar um arquivo php kill.php
  2. execute o arquivo php com a porta necessária $ php kill.php 8088
nivas
fonte
1
Usar não kill -9dá ao processo de destino a oportunidade de arrumar. Considere usar simples kill, pelo menos inicialmente.
roaima
+1 para usar PHP para esta tarefa.
Bananguin
@ G-Man por engano acrescentou
nivas
@Bananguin para matar id processo exato da determinada porta am usando este processo bando ao executar com Jenkins
nivas
ao executar arquivos de script e seu lsof -t -i:port_idcomando conter quando o processo de compilação o port_idou process idde port_idpode estar vazio, dessa vez obtemos algum erro de comando, para evitar que esse tipo de erro seja usado. Aqui eu posso matá-id processo exato do porto dado
nivas