Mata cualquier servicio que se ejecute en un puerto específico

13

Estoy tratando de escribir un script que mata el servicio que se ejecuta en un puerto específico. Este es mi guión:

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

Es un programa de Java. Este script funciona a veces, pero misteriosamente falla la mayor parte del tiempo.

¿Hay alguna otra forma de matar un servicio que se ejecuta en un puerto? Mi puerto es 4990.

Abhishek dot py
fuente
Su script también eliminaría los procesos de Java que se ejecutan en otras mascotas como 14990.
roaima

Respuestas:

32

Puedes probar fuser:

fuser -k 4990/tcp

O use lsofpara obtener la identificación del proceso, luego alimente a kill:

kill $(sudo lsof -t -i:4990)
Cuonglm
fuente
¿Debo reemplazar tcp con java?
Abhishek dot py
@Abhishekdotpy: No, uso tcp.
cuonglm
Gracias por esa -tbandera, la he necesitado por tanto tiempo.
Jackson
¿Podría dar una pista sobre cómo pasar correctamente la última línea a ssh?
Vladimir Protsenko
@VladimirProtsenko, ¿puedes proporcionar más contexto?
Cuonglm
4

Si desea eliminar cualquier servicio o proceso que se ejecute en el número de puerto 8080, primero debe encontrar el número de identificación de proceso (PID) del puerto 8080 y luego eliminarlo. Ejecute el siguiente comando para encontrar el número de puerto 8080 PID:

sudo lsof -t -i:8080

Aquí,

  • sudo : comando para solicitar privilegios de administrador (ID de usuario y contraseña).
  • lsof : lista de archivos (también se usa para enumerar procesos relacionados)
  • -t : muestra solo la ID del proceso
  • -i : muestra solo el proceso relacionado con las conexiones a Internet
  • : 8080 - mostrar solo procesos en este número de puerto

Entonces ahora puede matar fácilmente su PID usando el siguiente comando:

sudo kill -9 <PID>

Aquí,

  • kill - comando para matar el proceso
  • -9 - con fuerza

Puede usar un comando para matar un proceso en un puerto específico usando el siguiente comando:

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

Para más información, puede ver el siguiente enlace Cómo matar un proceso en un puerto específico en Linux

Mahfuz
fuente
El uso no kill -9le da al proceso objetivo la oportunidad de ordenar. Considere usar plain kill, al 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. crear un archivo php kill.php
  2. ejecuta el archivo php con el puerto requerido $ php kill.php 8088
nivas
fuente
1
El uso no kill -9le da al proceso objetivo la oportunidad de ordenar. Considere usar plain kill, al menos inicialmente.
roaima
+1 por usar PHP para esta tarea.
Bananguin
@ G-Man por error agregó
nivas
@Bananguin para matar la identificación exacta del proceso del puerto dado, estoy usando esto al ejecutar el proceso de grupo con jenkins
nivas
al ejecutar archivos de comandos y su contener lsof -t -i:port_idcomandos cuando el proceso de construcción port_ido process idde port_idpueden estar vacías, que el tiempo que tengamos alguna error de comando, para evitar ese tipo de error am utilizado este. aquí me puedo matar Identificación del proceso exacto de ese puerto,
nivas