Encuentra (y elimina) el proceso de bloqueo del puerto 3000 en Mac


1813

¿Cómo encuentro (y elimino) procesos que escuchan / usan mis puertos tcp? Estoy en Mac OS X.

A veces, después de un bloqueo o algún error, mi aplicación de rails está bloqueando el puerto 3000. No puedo encontrarlo usando ps -ef ...

Al hacer

rails server

yo obtengo

Dirección ya en uso - bind (2) (Errno :: EADDRINUSE)

Actualización 2014:

Para completar algunas de las respuestas a continuación: Después de ejecutar los comandos kill, puede ser necesario eliminar el archivo pid rm ~/mypath/myrailsapp/tmp/pids/server.pid


25
Puede encontrar una solución muy ordenada para eliminar un proceso en CUALQUIER puerto especificado por el usuario en la respuesta de @Kevin Suttle a continuación. Reproducido aquí para la posteridad:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584

44
Port 3000 no es 'específico para el desarrollo de rails': Meteor también se ejecuta de forma nativa en 3000, y estoy seguro de que hay otros.
gregorvand

El comentario anterior de @ user456584 debería ser la respuesta aceptada ^^^ Esa función funcionó para matar los muchos procesos que tenía en un puerto
Aneuway

Respuestas:


3029
  1. Puedes probar netstat

    netstat -vanp tcp | grep 3000
    
  2. Para macOS El Capitan y más recientes (o si su netstat no es compatible -p), uselsof

    sudo lsof -i tcp:3000 
    
  3. Para uso de Centos 7

    netstat -vanp --tcp | grep 3000
    

22
¡Gracias! Su respuesta dio a luz a mi script "death_to 'port'". (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1

192
El indicador "conciso" para lsof produce una salida adecuada para canalizar a una muerte posterior:lsof -t -i tcp:1234 | xargs kill
Manav

66
He puesto esto en mi ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillasí que ahora solo tengo que escribir killport 8080y me ahorra unos segundos
Alfonso Pérez

3
Otro consejo: asegúrate de probar sudoantes de lsof si no ves ningún resultado
Abe Petrillo

44
Otro consejo es agregar -Pal lsofcomando para que el puerto sin procesar sea visible en la salida:lsof -P -i:3000
Jason Axelson

1877

Encontrar:

sudo lsof -i :3000

Matar:

kill -9 <PID>

61
A veces lsof -i: port no mostrará nada. pruebe sudo lsof -i: puerto .
kilik52

31
Recomiende probar kill -15 <PID>antes de recurrir -9por seguridad.
Jamon Holmgren

77
@Jamon Holmgren ¿por qué? ¿Qué hacen los dos? ¿Y por qué kill <PID>no es suficiente / peligroso / incompleto?
Michael Trouw

13
@MichaelTrouw casi un año después, pero aquí está tu respuesta. :-) unix.stackexchange.com/a/8918 TL; DR kill -15le da al proceso la oportunidad de limpiar después de sí mismo.
Jamon Holmgren

99
Creo que esta respuesta debería decir qué -9hace.
Joseph Fraley

207

Nada de lo anterior funcionó para mí. Cualquier otra persona con mi experiencia podría intentar lo siguiente (funcionó para mí):

Correr:

lsof -i :3000 (where 3000 is your current port in use)

luego verifique el estado del PID reportado:

ps ax | grep <PID>

finalmente, "vete con eso":

kill -QUIT <PID>

18
Esta en realidad parece una mejor respuesta que la que dio mucho después Filip Spiridonov, que tiene 277 votos a favor contra su 9. La suya fue 6 meses antes, y tiene la misma información con un poco más de explicación. No hay justicia ...
Floris

Prueba kill -TERM(o solo kill) antes kill -QUIT. No todos los procesos van a hacer un cierre ordenado en SIGQUIT.
craig65535

160

Una línea para extraer el PID del proceso usando el puerto 3000 y matarlo.

lsof -ti:3000 | xargs kill

El indicador -t elimina todo menos el PID de la salida lsof, lo que facilita su eliminación.


13
Puede filtrar los puertos de "escucha" con:lsof -ti:3000 -sTCP:LISTEN
Zlemini

1
Este método funciona mejor para mí. Un trazador de líneas simple que despeja el puerto ocupado. ¡Gracias!
Ryan Trainor

139

La solución más fácil :

Para puerto único:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Mata múltiples puertos con un comando de línea simple:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (ID de proceso / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

kill $ (lsof -ti: 3001,3000)

Termina los procesos 82499 y 82500 en un solo comando.

Para usar esto en package.jsonscripts:

"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }


2
Esto funcionó para mí Gracias :)
DILEEP THOMAS

2
Me alegra que haya ayudado.
Abhijith Sasikumar

113

Esta única línea de comando es fácil de recordar:

npx kill-port 3000

Para una herramienta más poderosa con búsqueda:

npx fkill-cli


PD: utilizan paquetes de JavaScript de terceros. npxviene incorporado con Node.js.

Fuentes: tweet | github


¿Puedes compartir detalles sobre la instalación de npx usando brew? Intenté instalarlo en mi Mac High Sierra, 10.13.3 y no funcionará.
realPK

@realPK npxviene con el npmque viene node.js, por lo que no es un paquete separado. Simplemente actualice su node.js y sus versiones npm.
Bruno Lemos

Hago Java principalmente, todavía no me he expuesto a Node. Encontré una forma diferente de matar el servicio que se ejecuta en el puerto. TY por responder.
realPK

55
La necesidad de NodeJS y JavaScript, para matar algo que se ejecuta en el puerto 3000, probablemente se ralentiza ... me parece demasiado sobrecarga. agregar una línea simple a su .bashrc o .zshrc con un alias lo resolvería sin la necesidad de internet. alias kill3000 = 'lsof -ti: 3000 | xargs kill 'entonces puedes hacer: kill3000
Khalil Gharbaoui

La mejor solución a este problema ... gracias
King Rayhan

107

Puedes usar lsof -i:3000 .

Eso es "Lista de archivos abiertos". Esto le proporciona una lista de los procesos y qué archivos y puertos utilizan.


Estoy en 10.5 lepard (Q actualizado). No sé si eso importa aquí, pero lsof no muestra los puertos. lsof -h (lsof 4.78) es demasiado críptico también para mí ...
oma

1
Hmm No estoy seguro de Leopard, pero prueba ( como root , eso es importante, creo) lsof -i:3000.
Matt Gibson el

59

En su .bash_profile, cree un acceso directo para terminateel proceso 3000:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

Luego, llame $terminatesi está bloqueado.


12
Puede hacer esto lo suficientemente flexible para cualquier puerto: github.com/kevinSuttle/dotfiles/commit/…
Kevin Suttle

Y un nombre tan descriptivo = p
Michael Peterson

Tengo algo similar a esto pero paso en el puerto. Llamé a mi función KP para kill port.
Joseph Chambers

58

Para matar por la fuerza un proceso como ese, use el siguiente comando

lsof -n -i4TCP:3000 

Donde 3000 es el número de puerto en el que se ejecuta el proceso

esto devuelve la identificación del proceso (PID) y ejecuta

kill -9 "PID"

Reemplace PID con el número que obtiene después de ejecutar el primer comando

Por ejemplo, si quiero matar el proceso que se ejecuta en el puerto 8080


38
lsof -P | grep ':3000' | awk '{print $2}'

Esto te dará solo el pid, probado en MacOS.


10
en MAC mata todos los pids en el puerto 3000: lsof -P | grep ': 3000' | awk '{print $ 2}' | xargs kill -9
mike clagg

1
¿Puede más de un proceso escuchar el mismo puerto?
Kris

Nuestra aplicación de rieles genera trabajadores que son procesos secundarios, y tengo que usar esto para matar a los trabajadores huérfanos
Mike Clagg

2
esto también mata a los navegadores web que conectan al puerto
fjsj

55
Aquí está trabajando uno:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
bob

29

Ejecutar en línea de comando en OS-X El Captain:

kill -kill `lsof -t -i tcp:3000`

La opción concisa de lsof devuelve solo el PID.


28

Una de las formas de matar un proceso en un puerto es usar la biblioteca de python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Una vez instalado, simplemente:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

77
Esa no es, de lejos, la forma más simple. Las respuestas votadas no requieren que descargues e instales nada.
Greg Pasquariello

44
Cuando se cumplen los requisitos previos, esto es tan simple y fácil de recordar. Tenemos una definición diferente de "más simple" y esta respuesta es perfectamente válida y apropiada. Tal vez solo faltan las instrucciones para instalar Freeport con pip.
Cyril Duchon-Doris

debajo del capó, el puerto libre es solo un contenedor que llama lsof -t -i:3000... parece innecesario.
Corey Goldberg el

Esta solución no es la más fácil, pero cumple al 100% con lo que solicitó el OP ... Por lo tanto, es una escritura válida válida
danielrvt

26

Para ver los procesos que bloquean el puerto:

netstat -vanp tcp | grep 3000

Para matar los procesos que bloquean el puerto:

kill $(lsof -t -i :3000)


Esto no funcionará en una máquina Mac, devuelve lo siguiente: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Sin embargo, funcionará en la mayoría de las distribuciones de Linux
Milan Velebit

1
@MilanVelebit En realidad funciona perfectamente en mi máquina Mac (Sierra). Funciona bien si su puerto 3000está ocupado. Sin embargo, si ningún proceso está bloqueando el puerto, obtendrá un kill: not enough argumentserror.
Henry

Eso es extraño, tengo dos Mac (ambas High Sierra aunque), recuerdo ejecutar esos comandos en ambos (viejos hábitos) y sé con certeza que no se ejecutan. Acabo de intentarlo de nuevo en mi máquina, sabiendo que el puerto está ocupado, el mismo error. : /
Milan Velebit

¿Recibió un PID válido al ejecutar netstat -vanp tcp | grep 3000, para su puerto que está ocupado?
Henry

1
Lo probé en ambos bashy zshshell. Funciona bien para mi. No estoy seguro de por qué no funciona para ti. Puede ser algo con High Sierra? No tengo idea: /
Henry

24

Encuentra la conexión abierta

lsof -i -P | grep -i "escucha"

Matar por ID de proceso

kill -9 'PID'


20

Encuentra y mata:

Esta única línea de comando es fácil y funciona correctamente.

kill -9 $(lsof -ti tcp:3000)

14

Posibles formas de lograr esto:

parte superior

El comando superior es la forma tradicional de ver el uso de recursos de su sistema y ver los procesos que ocupan la mayoría de los recursos del sistema. Top muestra una lista de procesos, con los que usan más CPU en la parte superior.

PD

El comando ps enumera los procesos en ejecución. El siguiente comando enumera todos los procesos que se ejecutan en su sistema:

ps -A

También puede canalizar la salida a través de grep para buscar un proceso específico sin usar ningún otro comando. El siguiente comando buscaría el proceso de Firefox:

ps -A | grep firefox

La forma más común de pasar señales a un programa es con el comando kill.

kill PID_of_target_process

lsof

Lista de todos los archivos abiertos y los procesos que los abrieron.

lsof -i -P | grep -i "listen"
kill -9 PID

o

 lsof -i tcp:3000 

10

lsof -i tcp:port_number - enumerará el proceso que se ejecuta en ese puerto

kill -9 PID - matará el proceso

en tu caso, será

lsof -i tcp:3000 desde su terminal encuentre el PID del proceso

kill -9 PID



5

Añadir a ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

Entonces source ~/.bash_profiley corre

killTcpListen 8080



4

TL; DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Si se encuentra en una situación en la que hay clientes y servidores que utilizan el puerto, por ejemplo:

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

entonces probablemente no quieras matar a ambos.

En esta situación, puede usar -sTCP:LISTENpara mostrar solo el pid de los procesos que están escuchando. Combinando esto con el -tformato conciso, puede eliminar automáticamente el proceso:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

4

Hice una pequeña función para esto, agregarlo a su archivo RC ( .bashrc, .zshrco lo que sea)

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

entonces puedes escribir kill-by-port 3000 para matar su servidor de rails (sustituyendo 3000 por cualquier puerto en el que se esté ejecutando)

en su defecto, siempre podría escribir kill -9 $(cat tmp/pids/server.pid)desde el directorio raíz de rails


Tuve que hacer una barra diagonal inversa \$PORTpara que el mensaje se muestre correctamente. De lo contrario, funciona muy bien!
Ashwood

4

Para matar a múltiples puertos.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

¡Espero que esto ayude!


1

Deberías probar esto, esta técnica es independiente del sistema operativo.

Al lado de su aplicación, hay una carpeta llamada tmp, dentro de la cual hay otra carpeta llamada pids. Ese archivo contiene el archivo pid del servidor. Simplemente elimine ese archivo. el puerto se mata automáticamente.

Creo que este es el camino fácil.


1

Aquí hay una función bash auxiliar para matar múltiples procesos por nombre o puerto

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

Uso:

$ fkill [process name] [process port]

Ejemplo:

$ fkill someapp :8080 node :3333 :9000


0

Si desea una forma libre de código: abra el administrador de actividades y fuerce el nodo de eliminación :)



-1

Paso 1: Encuentra el servidor que se está ejecutando: ps aux | grep puma Paso 2: Mata a esos servidores Mata -9 [número de servidor]


-1

En mac OS

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')


1
Esto se publicó como un comentario hace 5 años, y las respuestas simulares se publicaron varias veces.
Gilles Gouaillardet
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.