Nodo / Express: EADDRINUSE, dirección ya en uso - Eliminar servidor


442

Tengo un servidor simple ejecutándose en node.js usando connect:

var server = require('connect').createServer();
//actions...
server.listen(3000);

En mi código tengo controladores reales, pero esa es la idea básica. El problema que sigo teniendo es

EADDRINUSE, Address already in use

Recibo este error cuando vuelvo a ejecutar mi aplicación después de que se bloqueó o produjo errores anteriormente. Como no estoy abriendo una nueva instancia de terminal, cierro el proceso con ctr + z.

Estoy bastante seguro de que todo lo que tengo que hacer es cerrar el servidor o la conexión. He intentado llamar server.close()en process.on('exit', ...);sin suerte.


39
En realidad, en lugar de Ctrl + zutilizarlo, debe Ctrl + ccerrar el programa correctamente enviando SIGQUIT :) Consulte la wiki para obtener más detalles :)
nacho4d

1
Te refieres a SIGINT. SIGQUIT se debe a `ctrl + \`
Xedecimal

53
Pruébelo pkill nodejso pkill nodeen un sistema operativo tipo UNIX
Gerard

1
Tuve un problema similar y encontré este paquete que le permitirá salir limpiamente cuando CTRL + C: npmjs.com/package/exit-hook
Jazzy

1
1. Parece que hay un ID de proceso suspendido o inactivo conectado al puerto, por lo que el servicio basado en nodos no se inicia y arroja el error PUERTO EN USO (DIRECCIÓN DE ERROR EN USO) 2. Estamos tratando de descubrir cómo liberar el puerto 10000 sin reiniciar el servidor.
abksharma

Respuestas:


146

process.on('exit', ..)no se llama si el proceso se bloquea o se mata. Solo se llama cuando finaliza el bucle de eventos y desdeserver.close() tipo de extremos del bucle de eventos (que todavía tiene que esperar para el funcionamiento de pilas actualmente aquí y allí) no tiene sentido para poner que dentro del evento de salida ...

En caso de accidente, haz process.on('uncaughtException', ..) y kill kill doprocess.on('SIGTERM', ..)

Dicho esto, SIGTERM (señal de apagado predeterminada) permite que la aplicación se limpie, mientras que SIGKILL (finalización inmediata) no permite que la aplicación haga nada.


3
también es útil enganchar en process.on ('SIGINT', ...)
farincz

487

También puede ir a la ruta de la línea de comando:

ps aux | grep node

para obtener los identificadores de proceso.

Entonces:

kill -9 PID

Hacer el -9 al matar envía un SIGKILL (en lugar de un SIGTERM). SIGTERM ha sido ignorado por el nodo para mí a veces.


1
ps aux | grep nodeno muestra nada; todavía textareaserver --editor-cmd='gvim -f'falla: 14 de marzo 21:19:30 - socket.io listo - aceptando conexiones Ahora podría iniciar el servidor: EADDRINUSE, dirección ya en uso
Jean Jordaan

75
¿Por qué esto en lugar dekillall -9 node
Martin Josefsson

1
pidoftambién es útil
JVE999

25
Usé esta respuesta durante mucho tiempo, luego un día la compuse en un solo revestimiento por conveniencia ... este comando matará cualquier proceso que se ejecute en un puerto determinado (8000 en este ejemplo): lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
Tenía varios servidores de nodos ejecutándose a la vez, algunos de ellos aplicaciones Electron. Tuve que usar solo killcon la identificación de proceso específica en lugar de killall.
tuliomir

226

Primero, querrá saber qué proceso está utilizando port 3000

sudo lsof -i :3000

esto mostrará una lista de todos los PID que escuchan en este puerto, una vez que tenga el PID puede terminarlo con lo siguiente:

kill -9 {PID}

17
Este comando identifica claramente el PID a diferencia de la salida de ps aux | grep nodepara mí. Tampoco lo necesitabasudo
Phil Gibbins

Esta es la mejor respuesta. Me funcionó bien con el puerto 8081, usando React Native con hilo.
Fernando Barbosa

Esto funciono muy bien para mi. Pude identificar dónde se usó el puerto 3000 y cerrarlo. Yo tampoco lo necesitaba sudo.
Campalo

Muy bien. También lo intenté después de recibir el comando, killall -9 {COMMAND}por ejemplokillall -9 node
STREET MONEY

wow, funcionó para mí
Anoop PS

162

Golpeé esto en mi computadora portátil con win8. Esto funcionó.

Ejecute cmd.exe como 'Administrador':

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

Lo estaba ejecutando desde la ventana de comandos y lo cerré por accidente. Nodo siguió ejecutándose en segundo plano ... (incluso después de que se terminó la sesión). En mi caso, una vez que cerré la pestaña del navegador que estaba conectada a través de sockets web, finalmente terminó.
Bertus Kruger

66
taskkill /F /IM node.exefunciona como un encanto para mí en Windows desde cualquier directorio :-) ¡Gracias por compartir!
Marty McGee

2
Esta es la única solución de trabajo de una sola línea que he podido verificar para Windows
Code Whisperer el

44
Funciona en Windows 10. No tuve que ejecutar el cmd.exe como administrador por cierto.
Glenn Werner

74

Verifique el PID, es decir, la identificación del proceso que se ejecuta en el puerto 3000 con el siguiente comando:

lsof -i tcp:3000

Saldría algo como lo siguiente:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

Ahora elimine el proceso usando:

kill -9 5805

esto funcionó para mí cuando uso el complemento fuera de línea de sls.
Junaid Atique

¡Gracias por esto! Acabo de empezar a aprender a reaccionar, como hace horas. :) Después de detener el servidor, lo volví a ejecutar, solo para encontrar tales errores.
Glenn

No obtengo salida si uso perdido. ¿Significa esto que no hay proceso en esa parte?
x89


29

Linux

Ejecute psy determine el PID de su proceso de nodo.

Entonces corre sudo kill PID

Ventanas

Utilice la lista de tareas para mostrar la lista de procesos en ejecución:

tasklist /O

Luego, elimine el proceso del nodo de esta manera (usando el PID obtenido del tasklistcomando):

taskkill /pid PID

1
¿Y si en Windows?
Trevor

1
Solo como una nota ... por alguna razón tuve que usar barras diagonales dobles en mis banderas para el comando taskkill de git-bash: taskkill //IM node.exe y acabo de matar a node. trabajó.
nawlbergs

23

Aquí hay un trazador de líneas (reemplace 3000 con un puerto o una variable de configuración):

kill $(lsof -t -i:3000)

20

Recibí este error una vez y tomé muchos de los enfoques aquí.

Mi problema fue que tenía dos app.listen(3000);llamadas en el mismo script app.js. La primera aplicación.listen () tuvo éxito donde la segunda arrojó el error.

Otro comando útil que encontré que me ayudó a depurar fue el sudo fuser -k 3000/tcpque eliminará cualquier proceso no autorizado que pueda haber iniciado (algunos procesos pueden reiniciarse, por ejemplo, si se ejecuta con forever.js, pero fue útil para mí).


el mismo problema aquí ... extraño que funcionaba correctamente en la depuración al obtener este error para ejecutarsenpm start
Asqan

16

Para Windows, abra el Administrador de tareas y encuentre los procesos node.exe. Mátalos a todos con End Task.

ingrese la descripción de la imagen aquí


1
tan fácil y no complicado para los usuarios de Windows
momal

Funciona. Gracias
Najathi

14
ps aux | grep node
kill -9 [PID] (provided by above command)

Descripción:


  1. ps proporcionará el estado del proceso, aux proporcionará la lista de a: todos los procesos de los usuarios, u: procesos propios del usuario, x: todos los demás procesos no conectados al terminal.
  2. símbolo de tubo: | pasará el resultado de ps aux para manipular más.
  3. grep buscará la cadena provista (nodo en nuestro caso) de la lista provista por ps aux.

12

Para su información, puede matar el proceso con un solo comando sudo fuser -k 3000/tcp. Esto se puede hacer para todos los demás puertos como 8000, 8080 o 9000 que se usan comúnmente para el desarrollo.



11

Primero descubra lo que se está ejecutando usando:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

Obtendrás algo como:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

Entonces puedes matar el proceso de la siguiente manera:

sudo kill 110

Entonces podrá ejecutar sin obtener el EADDRINUSE de escucha ::: 3000 errores


Estoy usando nodemon y reinicia el servicio nuevamente. ¿Hay alguna forma de matar a nodemon?
Smit Patel el

10

Para Visual Studio Noobs como yo

¡Puede estar ejecutando el proceso en otras terminales!

Después de cerrar el terminal en Visual Studio , el terminal simplemente desaparece .

Creé manualmente uno nuevo pensando que el anterior fue destruido. En realidad, cada vez que hacía clic en Nueva Terminal , en realidad estaba creando una nueva además de las anteriores .

Así que localicé la primera terminal y ... Voila, estaba ejecutando el servidor allí.

múltiples terminales sin darse cuenta


1
Oh si mi hermano
Jaydeep Shil

8

Administrador de tareas (ctrl + alt + del) ->

Pestaña Procesos ->

seleccione el proceso "node.exe" y presione "Finalizar proceso"


por qué matar todo el proceso de nodo si lo que estoy buscando es matar un proceso de puerto de nodo.
Jimmy Obonyo Abor

8

Puede encontrarse con escenarios en los que incluso matar el hilo o el proceso en realidad no terminará la aplicación (esto me sucede en Linux y Windows de vez en cuando). En ocasiones, es posible que ya tenga una instancia ejecutándose que no cerró.

Como resultado de ese tipo de circunstancias, prefiero agregar a mi package.json:

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

Entonces puedo llamarlos usando:

npm run stop-win
npm run stop-Linux

Puede ser más elegante y hacer esos comandos BIN con un indicador de argumento si lo desea. También puede agregarlos como comandos para ejecutar dentro de una cláusula try-catch.


5

En usuarios de Windows: abrir task managery end taskel nodejs.exearchivo, funciona bien.


4

Puede usar hot-node para evitar que su servidor falle / errores en tiempo de ejecución. Hot-node reinicia automáticamente la aplicación nodejs por usted cada vez que hay un cambio en el programa de nodo [fuente] / proceso [programa de nodo en ejecución].

Instale hot-node usando npm usando la opción global:

npm install -g hotnode


pm2 es una mejor opción. más robusto, más opciones. y no tiene el problema cuando se ejecuta como root que siempre tiene.
Lucas

@Lucas ¿Cuál es este problema raíz en el que siempre hablas? Desafortunadamente, me veo forzado a usar para siempre en lugar de pm2 en un producto en el trabajo (debido a alguna basura), ¡y esto me preocupa mucho!
GPX

4

Con el debido respeto a todas las respuestas en el formulario, me gustaría agregar un punto.

Descubrí que cuando finalizo una aplicación de nodo por error usando Ctrl + Z, la próxima vez que trato de abrirla tengo el mismo error EADDRINUSE.

Cuando uso Ctrl + C para terminar una aplicación de nodo, la próxima vez que la abrí, funcionó sin problemas.

Cambiar el número de puerto a otro diferente al error resolvió el problema.


1
Ctrl + C es lo correcto. Usé el mismo número de puerto que antes y funcionó como antes.
vipulnj

2
<key> Ctrl-Z </key> no detiene el proceso. Lo pone en segundo plano para que pueda ejecutar otros comandos. Esto es una cosa de shell de Unix. Para continuar el proceso, utilícelo fgen esa misma consola. Luego puede ver lo que sucede en ese servidor después de haber escrito varios comandos en la línea de comandos.
Alexis Wilke

4

En Linux

Añadir función a ~/.bashrc:

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

Tire de los cambios: source ~/.bashrc

Y úsalo: killTcpListen 3000


3

Por si acaso, compruebe si ha agregado esta línea varias veces por error

app.listen(3000, function() {
  console.log('listening on 3000')
});

El código anterior es para express, pero solo verifique si está intentando usar el mismo puerto dos veces en su código.


3

Win10, git bash v2.15, nodo v8.9.1, npm v5.5.1

Tenía un script package.json para iniciar el nodo: "start": "node index.js"

Cada vez que usé esto, independientemente de si lo maté con ctrl + c, me encontré con este problema.

Si solo corrí node index.jsde git bash en lugar de npm run startmatar con ctrl + c, nunca obtuve este error.

No estoy seguro de por qué, pero pensé que esto podría ayudar a alguien.


1
Estoy teniendo el mismo problema con esencialmente la misma configuración. en mi caso, noté que ejecutar una aplicación express a través de npm genera dos procesos, pero solo uno está cerrado cuando se usa ctrl + c. Al iniciar la aplicación con solo un nodo, solo se abre un proceso y se cierra correctamente.
worc

1
Este problema de Git para Windows está arrojando luz sobre todo el asunto. parece que podría haber un error en algún lugar entre mintty y una dependencia cygwin.
worc

3

Solución de interfaz de usuario para usuarios de Windows: descubrí que las respuestas principales no me funcionaban, parecían ser comandos para usuarios de Mac o Linux. Encontré una solución simple que no requería ningún comando para recordar: abrir el Administrador de tareas (ctrl + shift + esc). Mira los procesos en segundo plano en ejecución. Encuentra cualquier cosa Node.js y finaliza la tarea.

Después de hacer esto, el problema desapareció para mí. Como se indicó en otras respuestas, los procesos en segundo plano todavía se están ejecutando porque anteriormente se encontró un error y no se llamaron a las funciones regulares de salida / limpieza, por lo que una forma de eliminarlas es encontrar el proceso en el Administrador de tareas y eliminarlo allí . Si ejecutó el proceso desde un terminal / powerShell, generalmente puede usar ctrl + c para matarlo.


Sí, claro, gracias por tu respuesta
DINA TAKLIT

3

Reescribiendo el comentario de @Gerard en mi respuesta:

Pruébalo pkill nodejso pkill nodesi es como UNIX operativo .

Esto matará el proceso que ejecuta el servidor de nodo que se ejecuta en cualquier puerto. Trabajó para mi.

Namaste🙏


2

Node se está ejecutando en algún lugar de la memoria y tiene ese puerto bloqueado. En Windows, este problema ocurrirá, como la mayoría de los problemas de Windows, se resolverá presionando CTRL+ ALT+ DELy / o reiniciando.


Esta pregunta responde a muchas otras preguntas. Apáguelo y vuelva a encenderlo. Genio.
datUser

1

Las razones de estos problemas son:

  1. Cualquier aplicación puede estar ejecutándose en este puerto como Skype.
  2. El nodo puede haberse bloqueado y el puerto puede no haber sido liberado.
  3. Es posible que haya intentado iniciar el servidor más de uno. Para resolver este problema, se puede mantener un valor booleano para verificar si el servidor se ha iniciado o no. Debe iniciarse solo si el valor booleano es falso o indefinido;

1

server.close () tarda un tiempo en cerrar la conexión, por lo tanto, deberíamos hacer esto una llamada asincrónica como tal:

await server.close();

IMPORTANTE: al usar await , debemos usar la palabra clave asíncrona en nuestra función de encapsulación como tal:

async () => {
  await server.close();
}

1

Use el siguiente comando en el terminal / cmd para cambiar el puerto (npm run dev es para node.js), puede tener otros comandos para ejecutar su aplicación, la mayoría de ellos funcionará mientras cambia el puerto, más fácil y más rápido. Además, puede usar cualquier número de puerto que esté libre en su sistema en lugar de 3002

PORT=3002 npm run dev

La mayoría de las veces cuando uno ejecuta el proyecto mientras sale de él de forma abrupta o sin saberlo, presiona control + z que le da la salida del puerto, siempre elija control + c que no saldrá del puerto para ejecutar el servidor o el proyecto.

Además, es hora de cambiar el número de puerto en su código

server.listen(3002);

0

Esto significa que tiene dos servidores de nodo que se ejecutan en el mismo puerto, si uno se ejecuta en el puerto, digamos 3000, cambie el otro a otro puerto, digamos 3001, y todo funcionará bien

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.