¿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
function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
Respuestas:
Puedes probar
netstat
Para macOS El Capitan y más recientes (o si su netstat no es compatible
-p
), uselsof
Para uso de Centos 7
fuente
lsof -t -i tcp:#{ARGV.first} | xargs kill
)lsof -t -i tcp:1234 | xargs kill
~/.bash_profile
:findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkill
así que ahora solo tengo que escribirkillport 8080
y me ahorra unos segundossudo
antes de lsof si no ves ningún resultado-P
allsof
comando para que el puerto sin procesar sea visible en la salida:lsof -P -i:3000
Encontrar:
Matar:
fuente
kill -15 <PID>
antes de recurrir-9
por seguridad.kill <PID>
no es suficiente / peligroso / incompleto?kill -15
le da al proceso la oportunidad de limpiar después de sí mismo.-9
hace.Nada de lo anterior funcionó para mí. Cualquier otra persona con mi experiencia podría intentar lo siguiente (funcionó para mí):
Correr:
luego verifique el estado del PID reportado:
finalmente, "vete con eso":
fuente
kill -TERM
(o solokill
) anteskill -QUIT
. No todos los procesos van a hacer un cierre ordenado en SIGQUIT.Una línea para extraer el PID del proceso usando el puerto 3000 y matarlo.
El indicador -t elimina todo menos el PID de la salida lsof, lo que facilita su eliminación.
fuente
lsof -ti:3000 -sTCP:LISTEN
La solución más fácil :
Para puerto único:
Mata múltiples puertos con un comando de línea simple:
82500 (ID de proceso / PID)
82499
82499 82500
Termina los procesos 82499 y 82500 en un solo comando.
Para usar esto en
package.json
scripts:"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }
fuente
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.
npx
viene incorporado con Node.js.Fuentes: tweet | github
fuente
npx
viene con elnpm
que vienenode.js
, por lo que no es un paquete separado. Simplemente actualice su node.js y sus versiones npm.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.
fuente
lsof -i:3000
.En su
.bash_profile
, cree un acceso directo paraterminate
el proceso 3000:Luego, llame
$terminate
si está bloqueado.fuente
Para matar por la fuerza un proceso como ese, use el siguiente comando
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
Reemplace PID con el número que obtiene después de ejecutar el primer comando
fuente
Esto te dará solo el pid, probado en MacOS.
fuente
lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
Ejecutar en línea de comando en OS-X El Captain:
La opción concisa de lsof devuelve solo el PID.
fuente
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:
fuente
lsof -t -i:3000
... parece innecesario.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)
fuente
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 Linux3000
está ocupado. Sin embargo, si ningún proceso está bloqueando el puerto, obtendrá unkill: not enough arguments
error.netstat -vanp tcp | grep 3000
, para su puerto que está ocupado?bash
yzsh
shell. Funciona bien para mi. No estoy seguro de por qué no funciona para ti. Puede ser algo con High Sierra? No tengo idea: /Encuentra la conexión abierta
Matar por ID de proceso
fuente
Encuentra y mata:
Esta única línea de comando es fácil y funciona correctamente.
fuente
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:
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:
La forma más común de pasar señales a un programa es con el comando kill.
lsof
Lista de todos los archivos abiertos y los procesos que los abrieron.
o
fuente
lsof -i tcp:port_number
- enumerará el proceso que se ejecuta en ese puertokill -9 PID
- matará el procesoen tu caso, será
lsof -i tcp:3000
desde su terminal encuentre el PID del procesokill -9 PID
fuente
Estos dos comandos lo ayudarán a encontrar y eliminar el proceso del servidor
fuente
Añadir a
~/.bash_profile
:Entonces
source ~/.bash_profile
y correkillTcpListen 8080
fuente
Usando sindresorhus Es fkill herramienta, usted puede hacer esto:
fuente
TL; DR:
Si se encuentra en una situación en la que hay clientes y servidores que utilizan el puerto, por ejemplo:
entonces probablemente no quieras matar a ambos.
En esta situación, puede usar
-sTCP:LISTEN
para mostrar solo el pid de los procesos que están escuchando. Combinando esto con el-t
formato conciso, puede eliminar automáticamente el proceso:fuente
Hice una pequeña función para esto, agregarlo a su archivo RC (
.bashrc
,.zshrc
o lo que sea)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 railsfuente
\$PORT
para que el mensaje se muestre correctamente. De lo contrario, funciona muy bien!Para matar a múltiples puertos.
¡Espero que esto ayude!
fuente
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.
fuente
Aquí hay una función bash auxiliar para matar múltiples procesos por nombre o puerto
Uso:
Ejemplo:
fuente
Puedes probar esto
fuente
Si desea una forma libre de código: abra el administrador de actividades y fuerce el nodo de eliminación :)
fuente
Yo uso esto:
cat tmp/pids/server.pid | pbcopy
Entonces
kill -9 'paste'
fuente
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]fuente
En mac OS
kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')
fuente