¿Cómo encuentro (y elimino) procesos que escuchan/usan mis puertos TCP? Estoy en macOS.
A veces, después de un bloqueo o algún error, mi aplicación Rails bloquea el puerto 3000. No puedo encontrarlo usando ps -ef ...
al correr
rails serveryo obtengo
Address already in use - bind(2) (Errno::EADDRINUSE) El mismo problema ocurre al detener el proceso de Node.js. Incluso después de que se detiene el proceso y la aplicación deja de ejecutarse, el puerto 3000 está bloqueado. Al iniciar la aplicación de nuevo, obteniendo
Address already in use (Errno::EADDRINUSE)TL;RD:
lsof -ti tcp:3000 -sTCP:LISTEN | xargs killSi 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:LISTEN para mostrar solo el pid de los procesos que están escuchando. Combinando esto con el formato -t conciso, puede eliminar automáticamente el proceso:
lsof -ti tcp:3000 -sTCP:LISTEN | xargs killHice una pequeña función para esto, agrégala a tu archivo rc ( .bashrc , .zshrc o 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 } luego puede simplemente escribir kill-by-port 3000 para matar su servidor de rieles (sustituyendo 3000 por cualquier puerto en el que se esté ejecutando)
en su defecto, siempre puede escribir kill -9 $(cat tmp/pids/server.pid) desde el directorio raíz de Rails
Esta única línea de comando es fácil de recordar:
npx kill-port 3000
También puede eliminar varios puertos a la vez:
npx kill-port 3000 3001 3002
Para una herramienta más potente con búsqueda:
npx fkill-cli
PD: Usan paquetes javascript de terceros. npx viene integrado con Node.js.
Para matar a la fuerza un proceso como ese, use el siguiente comando
lsof -n -i4TCP:3000 OR lsof -i:3000Donde 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 qué kill -9 PID no funciona? Si intenta eliminar un proceso con su PID y aún se ejecuta en otro PID, parece que ha iniciado ese proceso en una cuenta diferente, lo más probable es que sea una cuenta raíz. así que inicia sesión con sudo su y mátalo
Agregar a ~/.bash_profile :
function killTcpListen () { kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t) } Luego source ~/.bash_profile y ejecute
killTcpListen 8080
Usando la herramienta fkill de sindresorhus , puede hacer esto:
$ fkill :3000Deberías probar este código usando la terminal:
$ killall -9 rubyPosibles formas de lograr esto:
cima
El comando superior es la forma tradicional de ver el uso de recursos de su sistema y ver los procesos que consumen la mayoría de los recursos del sistema. Arriba muestra una lista de procesos, con los que usan la mayor cantidad de 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 -ATambié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 firefoxLa forma más común de pasar señales a un programa es con el comando kill.
kill PID_of_target_processlsof
Lista de todos los archivos abiertos y los procesos que los abrieron.
lsof -i -P | grep -i "listen" kill -9 PIDo
lsof -i tcp:3000Una de las formas de eliminar 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 successfullyEjecutar 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.
Encuentra la conexión abierta
lsof -i -P | grep -i "escuchar"
Matar por ID de proceso
matar -9 'PID'
Una sola línea para extraer el PID del proceso usando el puerto 3000 y eliminarlo.
lsof -ti:3000 | xargs killEl indicador -t elimina todo menos el PID de la salida de lsof, lo que facilita eliminarlo.
Encontrar:
sudo lsof -i :3000Matar:
kill -9 <PID> TENGA EN CUENTA: -9 elimina el proceso de inmediato y no le da ninguna posibilidad de limpiarse después de sí mismo. Esto puede causar problemas. Considere usar -15 (TERM) o -3 (QUIT) para una terminación más suave que permita que el proceso se limpie después de sí mismo.
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 informado:
ps ax | grep <PID>finalmente, "fuera con eso":
kill -QUIT <PID>En su .bash_profile , cree un acceso directo para terminate el proceso 3000:
terminate(){ lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 } Luego, llama a $terminate si está bloqueado.
Puede usar lsof -i:3000 .
Eso es "Lista de archivos abiertos". Esto le da una lista de los procesos y qué archivos y puertos utilizan.
Puedes probar netstat
netstat -vanp tcp | grep 3000 Para macOS El Capitan y posteriores (o si su netstat no es compatible con -p ), use lsof
lsof -i tcp:3000Para el uso de Centos 7 :
netstat -vanp --tcp | grep 3000lsof -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
Puedes probar esto
netstat -vanp tcp | grep 3000en sistema operativo mac
kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')
Para matar puertos múltiples.
$ 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!
Estos dos comandos lo ayudarán a encontrar y eliminar el proceso del servidor
- lsof-wni tcp:3000
- matar -9 pid
Yo uso esto:
cat tmp/pids/server.pid | pbcopy
Luego kill -9 'paste'
Si desea una forma libre de código, abra el administrador de actividades y fuerce el nodo de eliminación :)
Solución rápida y fácil :
kill -9 $(lsof -ti:3000)Para múltiples puertos:
kill -9 $(lsof -ti:3000,3001)#3000 es el puerto a liberar
Elimine múltiples puertos con un comando de una sola línea:
kill -9 $(lsof -ti:3000,3001)#Aquí múltiples puertos 3000 y 3001 son los puertos a liberar
lsof-ti:3000
Si el prot está ocupado, el comando anterior devolverá algo como esto: 82500 (ID de proceso)
lsof-ti:3001
82499
lsof-ti:3001,3000
82499 82500
matar -9 $(lsof -ti:3001,3000)
Termina los procesos 82499 y 82500 en un solo comando.
Para usar esto en scripts de package.json :
"scripts": { "start": "kill -9 $(lsof -ti:3000,3001) && npm start" }En la terminal puedes usar:
npm run startDebería probar esto, esta técnica es independiente del sistema operativo.
Dentro 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 esta es la manera fácil.
Encuentra y mata:
Esta única línea de comando es fácil y funciona correctamente.
kill -9 $(lsof -ti tcp:3000)Aquí hay una función bash de ayuda 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 :9000Paso 1: busque el servidor que se está ejecutando: ps aux | grep puma Paso 2: Matar a esos servidores Matar -9 [número de servidor]
Para ver los procesos que bloquean el puerto:
netstat -vanp tcp | grep 3000
Para eliminar los procesos que bloquean el puerto:
kill $(lsof -t -i :3000)
lsof -P | grep ':3000' | awk '{print $2}'Esto le dará solo el pid, probado en MacOS.
solo escribe en la terminal
sudo kill -9 $(lsof -i :3000 -t)Espero, sea trabajo.
Después de ejecutar los comandos de eliminación, es posible que sea necesario eliminar el archivo pid:
rm ~/mypath/myrailsapp/tmp/pids/server.pidYo suelo:
lsof -wni tcp:3000
Obtenga el PID y:
kill -9 <PID>
mi frase favorita: sudo kill `sudo lsof -t -i:3000`
Para eliminar el puerto 3000 en Mac, ejecute el siguiente comando
kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)
kill -9 $(lsof -ti:3000)funciona para mí en macOS siempre.
Si está trabajando en un proyecto de node.js, puede agregarlo a scripts de package.json como;
"scripts": { ... "killme": "kill -9 $(lsof -ti:3000)", ... },luego
npm run killme--
Además, si desea agregar un alias de todo el sistema para su macOS, siga estos pasos;
Navegue a su directorio de inicio:
cd ~Abra el perfil .bash_profile o zsh usando nano o vim:
vi .bash_profileAgregue un alias (presione i):
alias killme="kill -9 $(lsof -ti:3000)"guardar el archivo
reiniciar terminal
escribe killme en la terminal
Por supuesto, puede cambiar el puerto 3000 a lo que desee.
Si está utilizando Zsh y no quiere recordar los comandos de varias tuberías, simplemente agregue las siguientes líneas de código a ~/.zshrc :
function murder() { lsof -nti:$1 | xargs kill -9 }Y luego, cada vez que necesite eliminar un proceso en un puerto específico, simplemente use:
murder 3000PS siéntase libre de cambiar el nombre del comando y mejorarlo :)
Tengo Macbook Pro (Catalina), 1 día encontré el siguiente problema mientras ejecutaba el servidor Django (que se ejecuta en el puerto 8000 de forma predeterminada):
Python Manage.py Runerver 3000
(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ python manage.py runserver 3000 Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). July 27, 2021 - 23:54:05 Django version 3.2.3, using settings 'automated_classification.settings' Starting development server at http://127.0.0.1:3000/ Quit the server with CONTROL-C. Error: That port is already in use.Traté de usar el proporcionado y ejecutado, pero ejecutar solo 1 de ellos no resolvió mi problema (sé que también hubo otras respuestas, pero de alguna manera resolví mi problema). Por ejemplo, traté de volver a ejecutar el comando anterior, pero tampoco funcionó (todavía los procesos estaban activos).
Así que finalmente usé la respuesta de @Cris con 1 paso adicional más como él y otros han sugerido. Entonces, mi respuesta es simplemente usar sus comandos con la salida de la Terminal para que las ejecuciones sean más claras para usted.
lsof -P | grep':3000' | awk '{imprimir $2}'
(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ lsof -P | grep ':3000' | awk '{print $2}' 36239 38272Ahora tengo la lista de identificaciones para matar, hagámoslo.
matar -9 <PID>
(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ kill -9 36239 (venv) Rishikeshs-MacBook-Pro:learn-django hygull$ kill -9 36239 -bash: kill: (36239) - No such process (venv) Rishikeshs-MacBook-Pro:learn-django hygull$ kill -9 38272 (venv) Rishikeshs-MacBook-Pro:learn-django hygull$ kill -9 38272 -bash: kill: (38272) - No such processY ahora, intentemos volver a ejecutar el comando.
Python Manage.py Runerver 3000
(venv) Rishikeshs-MacBook-Pro:learn-django hygull$ python manage.py runserver 3000 Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). July 27, 2021 - 23:55:53 Django version 3.2.3, using settings 'project.settings' Starting development server at http://127.0.0.1:3000/ Quit the server with CONTROL-C.matar -9 $(lsof -P | grep ':3000' | awk '{imprimir $2}')
Puede combinar los 2 pasos anteriores en 1 línea y ejecutar para eliminar el proceso de escucha en el puerto 3000 .
Me funciona para terminar el nodo (Mac OS Catalina)
killall -9 node