Nodo/Express: EADDRINUSE, Dirección ya en uso: ¿cómo puedo detener el proceso usando el puerto?

Resuelto Skawful asked hace 14 años • 58 respuestas

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 de ruta reales, pero esa es la idea básica. El error que sigo recibiendo es:

EADDRINUSE, Address already in use

Recibo este error cuando ejecuto mi aplicación nuevamente después de que falló o hubo errores anteriormente. Como no voy a abrir una nueva instancia de terminal, cierro el proceso conctrl + z .

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

Skawful avatar Nov 02 '10 13:11 Skawful
Aceptado

Primero, querrás saber qué proceso está utilizandoport 3000

sudo lsof -i :3000

esto enumerará todos los PID que escuchan en este puerto; una vez que tenga el PID , puede finalizarlo con lo siguiente:

kill -9 <PID>

donde reemplaza <PID>por el ID del proceso, o la lista de ID de proceso, la salida del comando anterior.

Mina Gabriel avatar Apr 20 '2017 18:04 Mina Gabriel

También puedes seguir la ruta de la línea de comando:

ps aux | grep node

para obtener los identificadores del proceso.

Entonces:

kill -9 PID

Hacer el -9 al matar envía un SIGKILL (en lugar de un SIGTERM). A veces, el nodo ha ignorado SIGTERM.

djburdick avatar Nov 22 '2010 16:11 djburdick

Presioné 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.
Sushil avatar May 08 '2013 04:05 Sushil

process.on('exit', ..)no se llama si el proceso falla o finaliza. Solo se llama cuando finaliza el ciclo de eventos, y dado que server.close() en cierto modo finaliza el ciclo de eventos (todavía tiene que esperar las pilas que se están ejecutando actualmente aquí y allá), no tiene sentido poner eso dentro del evento de salida...

Al chocar, hacer process.on('uncaughtException', ..)y al matar, hacerprocess.on('SIGTERM', ..)

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

Tor Valamo avatar Nov 03 '2010 10:11 Tor Valamo

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 finalice el proceso usando:

kill -9 5805
Ayan avatar Nov 17 '2017 06:11 Ayan