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

oma
fuente
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
    
ghostdog74
fuente
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>
Filip Spiridonov
fuente
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>
Austin
fuente
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.

Zlemini
fuente
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" }

Abhijith Sasikumar
fuente
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

Bruno Lemos
fuente
¿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.

DerMike
fuente
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.

alexzg
fuente
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

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

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

Kris
fuente
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.

JE42
fuente
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
YBathia
fuente
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)

Enrique
fuente
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'

Sourabh Bhagat
fuente
20

Encuentra y mata:

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

kill -9 $(lsof -ti tcp:3000)
Dylan Breugne
fuente
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 
suave
fuente
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

Shan
fuente
10

Estos dos comandos lo ayudarán a encontrar y eliminar el proceso del servidor

  1. lsof -wni tcp: 3000
  2. matar -9 pid
Saif Chaudhry
fuente
Un placer, Aashiah
Saif chaudhry
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

rofrol
fuente
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
Benjie
fuente
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

Caleb Keene
fuente
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!

Binh Ho
fuente
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.

Arun P
fuente
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
Miguel Mota
fuente
1

Puedes probar esto

netstat -vanp tcp | grep 3000
Foram Thakral
fuente
0

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

HannahCarney
fuente
0

Yo uso esto:

cat tmp/pids/server.pid | pbcopy

Entonces kill -9 'paste'

Mihail hidr0 Kirilov
fuente
-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]

Thiện Nguyễn
fuente
-1

En mac OS

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

Nada
fuente
1
Esto se publicó como un comentario hace 5 años, y las respuestas simulares se publicaron varias veces.
Gilles Gouaillardet