Tengo un servidor TCP simple que escucha en un puerto.
var net = require("net");
var server = net.createServer(function(socket) {
socket.end("Hello!\n");
});
server.listen(7777);
Lo inicio node server.js
y luego lo cierro con Ctrl + Z en Mac. Cuando intento ejecutarlo nuevamente con node server.js
este mensaje de error:
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)
¿Estoy cerrando el programa de manera incorrecta? ¿Cómo puedo evitar que esto suceda?
fg
después de Ctrl-Z, volverá a donde lo dejó. Entonces su nodo anterior todavía se está ejecutando. ¡Cuidado si estás haciendo esto para otros comandos también!Ctrl+Z
acción, una metodología adecuada podría serfg
revivir el proceso y luegoCtrl+C
matarlo adecuadamente.Respuestas:
Para finalizar el programa, deberías estar usando Ctrl+ C. Si lo hace, se envía
SIGINT
, lo que permite que el programa finalice correctamente, desvinculándose de cualquier puerto en el que esté escuchando.Ver también: https://superuser.com/a/262948/48624
fuente
Ctrl + C
no funciona para mi Solo^C
se escribe en la consola y el programa no sale.Ctrl+C
funciona bien. En cualquier caso, ese es un problema separado de su problema real. Debería publicar una pregunta "Ctrl + C no funciona" en SuperUser.com.kill -9
, pero yo no. ¿Está realmente seguro de que su aplicación sigue siendo la que mantiene abiertos los puertos? Nunca he tenido ese problema. Tan pronto como finalice mi solicitud, las conexiones siempre se terminan de inmediato. Usaría netstat para determinar si su aplicación o alguna otra cosa persiste en ese puerto.Ctrl+ lo Zsuspende, lo que significa que todavía puede estar ejecutándose.
Ctrl+ en Crealidad lo matará.
También puedes matarlo manualmente de esta manera:
Encuentre la identificación del proceso (segundo desde la izquierda):
Esto también puede funcionar
fuente
killall node
en su respuesta, ya que esa es realmente la opción más fácil y confiable (siempre y cuando esté de acuerdo con matar todas las instancias)O, alternativamente, puede hacer todo esto en una línea:
Puede reemplazar el nodo dentro de '\ snode \ s' con cualquier otro nombre de proceso.
fuente
Reanudar y matar el proceso:
Ctrl+ lo Zsuspende, lo que significa que todavía se está ejecutando como un proceso en segundo plano suspendido.
Es probable que ahora esté en un indicador de terminal ...
Dé el comando
fg
para reanudar el proceso en primer plano.escriba Ctrl+ Cpara matarlo correctamente.
Alternativamente, puede matarlo manualmente de esta manera:
( NOTA: los siguientes comandos pueden requerir root, también
sudo ...
tu amigo)o, si no tiene pkill, esto puede funcionar:
o tal vez esto:
a veces el proceso enumerará su propio grep, en cuyo caso necesitará:
.
h / t @ruffin de los comentarios sobre la pregunta en sí. Tuve el mismo problema y su comentario me ayudó a resolverlo yo mismo.
fuente
puede escribir
.exit
para salir del nodo js REPLfuente
Si está ejecutando Node.js de forma interactiva (REPL):
Ctrl+ Clo llevará de regreso a> prompt y luego escriba:
o simplemente use Ctrl+ D.
fuente
$ sudo killall node
en otro terminal funciona en mac , mientraskillall node
no funciona:fuente
en linux intente:
pkill node
en ventanas:
o
fuente
Aunque esta es una respuesta tardía, encontré esto en los documentos de NodeJS :
Para resumir, puede salir por:
.exit
en nodejs REPL.<ctrl>-C
dos veces.<ctrl>-D
.process.exit(0)
lo que significa una salida natural de REPL. Si desea devolver cualquier otro estado, puede devolver un número distinto de cero.process.kill(process.pid)
es la forma de matar usando la API de nodejs desde su código o desde REPL.fuente
Estoy agregando esta respuesta porque para muchos proyectos con implementaciones de producción, tenemos scripts que detienen estos procesos para que no tengamos que hacerlo.
Una forma limpia de administrar los procesos de Node Server es usar el
forever
paquete (fromNPM
).Ejemplo:
Instalar para siempre
npm install forever -g
Ejecutar servidor de nodo
forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js
Resultado:
info: Forever processing file: server.js
Servidor de nodo de apagado
forever stop server.js
Resultado
info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247
Esto cerrará limpiamente la aplicación del servidor.
fuente
Si quieres detener tu servidor
npm stop
o algo así. Puede escribir el código que mata el proceso de su servidor como:Consulte este enlace para obtener más detalles: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5
fuente
Me encontré con un problema en el que tengo varios servidores de nodos ejecutándose, y solo quiero matar a uno de ellos y volver a implementarlo desde un script.
Nota: Este ejemplo está en un bash shell en Mac.
Para hacerlo, me aseguro de hacer que mi
node
llamada sea lo más específica posible. Por ejemplo, en lugar de llamarnode server.js
desde el directorio de aplicaciones, llamonode app_name_1/app/server.js
Entonces puedo matarlo usando:
kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')
Esto solo matará el proceso de nodo que ejecuta app_name_1 / app / server.js.
Si corriste
node app_name_2/app/server.js
este proceso de nodo continuará ejecutándose.Si decides que quieres matarlos, puedes usarlos
killall node
como otros han mencionado.fuente
Respuesta tardía pero en Windows, abrir el administrador de tareas con CTRL + ALT + SUPR y luego eliminar los procesos de Node.js resolverá este error.
fuente
puede trabajar siguiendo el comando para ser específico en localserver kill (aquí: 8000)
Le dará los siguientes grupos de TCP:
Eliminará el Id. De proceso correspondiente a TCP *: 8000
fuente
Para MacOS
Ejecute el siguiente código y presione enter
fuente
Puede usar el fusor para obtener lo que desea que se haga.
Para obtener los identificadores de proceso de las tareas que se ejecutan en un puerto, puede hacer lo siguiente:
Digamos que el puerto es 8888, el comando se convierte en:
Y para eliminar un proceso que se ejecuta en un puerto, simplemente agregue el conmutador -k.
Ejemplo (el puerto es 8888):
¡Eso es! Cerrará el proceso escuchando en el puerto. Normalmente hago esto antes de ejecutar mi aplicación de servidor.
fuente
Mi caso de uso: en MacOS , ejecute / vuelva a ejecutar servidores de múltiples nodos en diferentes puertos desde un script
ejecutar :
"cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."
stop1 :
"kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"
stop2, stop3 ...
volver a ejecutar :
"stop1 & stop2 & ... & stopN ; run
para obtener más información sobre cómo encontrar un proceso por un puerto: ¿Quién está escuchando en un puerto TCP dado en Mac OS X?
fuente
Para Windows, primero busque el PID con su número de puerto
Después de eso, elimine la tarea, asegúrese de estar en la raíz de su unidad "c" y el comando será
taskkill /F /PID your pid
fuente
Si está utilizando VS Code y terminal, seleccione el nodo del menú desplegable del lado derecho primero y luego haga Ctrl + C. Luego funcionará
Presione y cuando se le solicite.
Gracias
fuente