¿Cómo matar un proceso que se ejecuta en un puerto particular en Linux?

763

Traté de cerrar el tomcat usando ./shutdown.shdel /bindirectorio tomcat . Pero descubrió que el servidor no estaba cerrado correctamente. Y, por lo tanto, no pude reiniciar
Mi Tomcat se está ejecutando en el puerto 8080.

Quiero matar el proceso de Tomcat que se está ejecutando 8080. Primero quiero tener la lista de procesos ejecutándose en un puerto específico (8080) para seleccionar qué proceso matar.

veer7
fuente
2
posible duplicado del script
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

939

Esto fuser 8080/tcpimprimirá su PID del proceso vinculado a ese puerto.

Y esto fuser -k 8080/tcpmatará ese proceso.

Funciona solo en Linux. Más universal es el uso de lsof -i4(o 6 para IPv6).

nudzo
fuente
2
¿esto también cierra un posible zócalo conectado al 8080?
fer y
99
No cierra correctamente el puerto. El puerto se coloca en el estado TIME_WAIT después de que se elimina el proceso principal. El sistema operativo cerrará el puerto por completo después de unos 60 segundos. Significa que no puede reutilizar el puerto durante al menos 60 segundos (a menos que le dé la opción de reutilización al zócalo).
Mark Lakata
2
En Darwin, debe estar usando una versión diferente de fuser. Solo toma un archivo, no es compatible -k.
ap
3
'fuser -k -n tcp 8080' también matará el proceso
Hesham Yassin
77
@dbliss fuser es parte de psmisc. En caso de que obtenga fuser: command not found, instale psmisc. Para CentOS / RHEL 7, ejecutesudo yum install psmisc
Tom
700

Para enumerar cualquier proceso que escuche el puerto 8080:

lsof -i:8080

Para matar cualquier proceso que escuche el puerto 8080:

kill $(lsof -t -i:8080)

o más violentamente:

kill -9 $(lsof -t -i:8080)

( -9Corresponde a la SIGKILL - terminate immediately/hard killseñal: ver Lista de señales de finalización y ¿Cuál es el propósito de la opción -9 en el comando kill? Si no se especifica ninguna señal al. kill, La señal TERM alias -15o soft killse envía, que a veces no es suficiente para matar un proceso.).

Franck Dernoncourt
fuente
99
kill: uso: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] Esto es lo que obtengo cuando
ejecuto
2
@SudhirBelagali lo hizo con el superusuariosudo
Marcel Djaman
55
También funcionó en mi Mac
asherbar
2
Me gustaría agregar que a veces no tienes permisos para ver la identificación del proceso, en ese caso debes hacerlo sudo lsof -i:8080.
Akavall
1
¿Por qué los segundos consejos son más violentos?
Webwoman
281

Usa el comando

 sudo netstat -plten |grep java

usado grep java como tomcatusosjava como sus procesos.

Mostrará la lista de procesos con el número de puerto y la identificación del proceso

tcp6       0      0 :::8080                 :::*                    LISTEN      
1000       30070621    16085/java

El número anterior /javaes una identificación de proceso. Ahora usa el killcomando para matar el proceso

kill -9 16085

-9 implica que el proceso será asesinado a la fuerza.

veer7
fuente
11
Es posible que desee agregar que uno podría necesitar privilegios de root para obtener los nombres de los procesos netstat.
Jonas Schäfer
2
@JonasWielicki puede ver los que posee sin privilegios de root.
dbliss
Necesitaba privilegios de root para netstat. ¿Hay alguna manera de saber realmente de dónde vino el proceso? Por lo que pude ver, había cerrado todas las aplicaciones, pero podría haber sido desde una ventana de terminal donde, sin querer, empujé los procesos a una tarea en segundo plano. Tal vez debería haber ejecutado el comando de terminal 'ps' para ver todos los procesos primero ...
JesseBoyd
150

Añadiría este one-liner para matar solo LISTEN en un puerto específico:

kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)

Gal Bracha
fuente
99
Creo que esta debería ser la mejor respuesta. Gracias @ Gal Bracha
Sam Kah Chiin
2
¡Esta es la mejor solución porque no mata mi navegador también!
Russo
¡La mejor respuesta! Simple, conciso, y hace el trabajo correctamente.
Zar Bomba
116

Puedes usar el comando lsof. Deje que el número de puerto como aquí es 8090

lsof -i:8090

Este comando devuelve una lista de procesos abiertos en este puerto.

Algo como…

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 75782 eoin 5u IPv6 0x01c1c234 0t0 TCP localhost:8090 (LISTEN)

Para liberar el puerto, elimine el proceso usándolo (la identificación del proceso es 75782) ...

kill -9 75782

Este me funcionó. Aquí está el enlace de la publicación original: enlace

Kop4lyf
fuente
1
para matar el proceso con fuerza, deberá usar -9 como kill -9 75782; como a veces algunos procesos no se matan con sólo kill
veer7
73

Si desea eliminar un proceso que se ejecuta en el número de puerto 8080, primero debe encontrar el número de identificación del 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:8080)

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

Mahfuz
fuente
gracias amigo. sudo kill -9 $(sudo lsof -t -i:8080)funcionó para mí
Junaid
69

La mejor manera de matar todos los procesos en un puerto específico;

kill -9 $(sudo lsof -t -i:8080)
Berkay Kırmızıoğlu
fuente
1
¡Trabajó! Gracias.
Fred
¡Funcionó !, gracias.
Jaylers
Solución maravillosamente simple usando un subshell. ¡Gracias!
Jason R Stevens CFA
no sudo solicitud de contraseña
Kuldeep Yadav
41

Esto se imprime para mostrar los identificadores de proceso de todo lo que se ejecuta en <port_number>:

fuser -n tcp <port_number> 

También imprime algunas cosas en stderr, así que:

fuser -n tcp <port_number> 2> /dev/null

Entonces podemos suministrar estos identificadores de proceso al killcomando:

sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

También podría poner esto en una función si lo hace mucho:

function killport() {
    sudo kill $(fuser -n tcp $1 2> /dev/null)
}
Brian Peterson
fuente
35

Obtenga el PID de la tarea y elimínelo.

lsof -ti:8080 | xargs kill
Rahul Garg
fuente
Gracias por la respuesta. Funciona muy bien en Mac OS. Eress el mejor. Just Up Vote.
AMIC MING
1
Funciona bien con rangos de puertos, también, como lsof -ti:8080-8089 | xargs kill.
dvlsg
34

Para conocer el pid del servicio que se ejecuta en un puerto en particular:

netstat -tulnap | grep :*port_num*

Obtendrá la descripción de ese proceso. Ahora usa kill o kill -9 pid. Fácilmente asesinado.

p.ej

netstat -ap | grep :8080

tcp6       0      0 :::8080       :::*    LISTEN      1880/java 

Ahora:

kill -9 1880

Recuerde ejecutar todos los comandos como root

Sanjay s.
fuente
30

Un trazador de líneas

kill -9 $(lsof -t -i tcp:8080)

explicación aquí: use una combinación de lsof and kill

root@localhost:~# lsof -i tcp:8080
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    23672 sine  238u  IPv6 3028222      0t0  TCP localhost:http-alt (LISTEN)

seleccione pid y use kill

kill 23672
dlmeetei
fuente
22

intenta así,

 sudo fuser -n tcp -k 8080
Adil Abbasi
fuente
16

Elija el número de puerto y aplique el comando grep en netstat como se muestra a continuación

netstat -ap | grep :7070

Salida de la consola

tcp 0 0 ::: 7070 ::: * ESCUCHE 3332 / java

Eliminar el servicio basado en PID (Número de identificación del proceso)

kill -9 3332
Lova Chittumuri
fuente
13
  1. lsof -i tcp:8000 Este comando enumera la información sobre el proceso que se ejecuta en el puerto 8000

  2. kill -9 [PID] Este comando mata el proceso

Nandhitha Ramaraj
fuente
Me acabo de dar cuenta de que voté en contra de esto por accidente hace unas semanas, si editas un poco tu respuesta debería poder eliminarla
Robin-Hoodie
12

Linux : Primero puede encontrar el PID de este comando si conoce el puerto:

netstat -tulpn 

ejemplo:-

 Local Address  Foreign Address  State    PID/Program name

  :::3000       :::*             LISTEN    15986/node 

Luego tomas el proceso de matar. ejecuta el siguiente comando:

matar -9 PID

Expample: -

matar -9 15986

Kundan Kumar
fuente
10

Linux : puede usar este comando si conoce el puerto:

netstat -plten | grep LISTEN | grep 8080

AIX :

netstat -Aan | grep LISTEN | grep 8080

Luego toma la primera columna (ejemplo: f100050000b05bb8) y ejecuta el siguiente comando:

rmsock f100050000b05bb8 tcpcb

proceso de matanza.

ben rhouma moez
fuente
10

Puede conocer la lista de todos los puertos que se ejecutan en el sistema junto con sus detalles (pid, dirección, etc.):

netstat -tulpn

Puede conocer los detalles de un número de puerto en particular al proporcionar el número de puerto en el siguiente comando:

sudo netstat -lutnp | grep -w '{port_number}'

Ej: sudo netstat -lutnp | grep -w '8080' Los detalles se proporcionarán así:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

si quieres matar un proceso usando pid entonces :kill -9 {PID}

si quieres matar un proceso usando el número de puerto :fuser -n tcp {port_number}

utilícelo sudosi no puede acceder a ninguno.

LADRAR
fuente
6

kill -9 `fuser 8080/tcp|xargs -n 1`, estos comandos también eliminan el proceso que escucha en el puerto 8080 con conexión TCP

Harshit Garg
fuente
4
sudo apt-get install psmisc (or sudo yum install psmisc)
sudo fuser 80/tcp

Resultado: 80 / tcp: 1858 1867 1868 1869 1871

Proceso de matanza uno por uno

matar -9 1858

Fadid
fuente
3

Estoy trabajando en un sistema Yocto Linux que tiene un conjunto limitado de herramientas Linux disponibles. Quería matar el proceso que estaba usando un puerto en particular (1883).

Primero, para ver qué puertos estamos escuchando, utilicé el siguiente comando:

root@root:~# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:hostmon         0.0.0.0:*               LISTEN      
tcp        0      0 localhost.localdomain:domain 0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
tcp        0      0 :::hostmon              :::*                    LISTEN      
tcp        0      0 localhost:domain        :::*                    LISTEN      
tcp        0      0 :::ssh                  :::*                    LISTEN      
tcp        0      0 :::1883                 :::*                    LISTEN      

Luego, encontré el nombre del proceso usando el puerto 1883 de la siguiente manera:

root@root:~# fuser 1883/tcp
290 
root@root:~# ps | grep 290
  290 mosquitt 25508 S    /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
12141 root      8444 S    grep 290

Como podemos ver arriba, es el programa /usr/sbin/mosquitto que usa el puerto 1883.

Por último, maté el proceso:

root@root:~# systemctl stop mosquitto

Solía systemctlbecuase en este caso se trataba de un servicio systemd.

Daniel Jonsson
fuente
2

En mi caso, cent os tiene algún problema en la respuesta sugerida. Entonces utilicé la siguiente solución:

  ss -tanp | grep 65432 | head -1 | grep -Po "(?<=pid=).*(?=,)" | xargs kill
Kamesh Jungi
fuente
1

para construir sobre lo que @ veer7 dijo:

si quieres saber qué había en el puerto, haz esto antes de matarlo.

$ sudo netstat -plten |grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       906726      25296/java      
tcp6       0      0 :::8009                 :::*                    LISTEN      1000       907503      25296/java      
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       907499      25296/java      
$ ps 25296
  PID TTY      STAT   TIME COMMAND
25296 ?        Sl     0:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dcatalina.base=/hom

Use 'ps' y el número del proceso que netstat informó de nuevo

JesseBoyd
fuente
1

Otra forma con Git Bash:

stopProcessByPortNumber() {
port=":${1}"
portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
echo $processId
taskkill -PID $processId -F
}
Lucas Moyano Angelini
fuente
1
  1. primero verifica el proceso netstat -lt
  2. verificar id del proceso fuser <port number>/tcp
  3. matar el proceso que se ejecuta en el puerto kill <process id>
Gunjan Paul
fuente
-3

En Windows, será netstat -ano | grep "8080"y recibimos el siguiente mensajeTCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

Podemos matar el PID usando taskkill /F /PID 10076

Chaklader
fuente
La pregunta es claramente pedir ayuda de Linux; no Windows
babycakes