Nodo/Express: EADDRINUSE, Dirección ya en uso: ¿cómo puedo detener el proceso usando el puerto?
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.
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.
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.
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.
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.
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