Detener el programa node.js desde la línea de comando

305

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.jsy luego lo cierro con Ctrl + Z en Mac. Cuando intento ejecutarlo nuevamente con node server.jseste 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?

Eleeist
fuente
2
Probablemente valga la pena agregar que Ctrl-Z suspende un comando en * NIX y no lo cierra. Si escribe fgdespué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!
ruffin
1
@ruffin esto debería ser una respuesta. Si ha realizado la Ctrl+Zacción, una metodología adecuada podría ser fgrevivir el proceso y luego Ctrl+Cmatarlo adecuadamente.
Metagrapher

Respuestas:

393

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

Puntilla
fuente
21
Ctrl + Cno funciona para mi Solo ^Cse escribe en la consola y el programa no sale.
Eleeist
1
@Eleeist, ¿qué estás usando como terminal? Funciona muy bien para mí.
Brad
2
@Eleeist, probablemente hayas reasignado tus llaves o algo así. Ctrl+Cfunciona 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.
Brad
1
@ jt0dd Siempre podrías 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.
Brad
1
Me enfrenté a este problema cuando estaba usando el tipo de teclado en otro idioma. Asegúrese de que su idioma de entrada es mac Inglés
Fa.Shapouri
326

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:

ps aux | grep node

Encuentre la identificación del proceso (segundo desde la izquierda):

kill -9 PROCESS_ID

Esto también puede funcionar

killall node
Jamund Ferguson
fuente
ctrl + c funcionará pero ninguno de estos comandos funcionará para mí. No se por que Y estoy buscando una solución de línea de comando
kiwi enojado
77
Tenga cuidado con el nodo killall, puede matar el proceso que no querría matar si coinciden con "nodo"
Samuel Bolduc
1
es posible que desee avanzar killall nodeen 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)
Boern
44
'killall' no se reconoce como un comando interno o externo, programa operativo o archivo por lotes. ¿Me estoy perdiendo de algo?
Ayyash el
Lo mismo aquí ... ¿Sin respuesta? Dice que 'killall' no es reconocido. Ninguno de los otros comandos funciona tampoco. ¿Necesito reiniciar mi computadora o qué?
Metodista
37

O, alternativamente, puede hacer todo esto en una línea:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

Puede reemplazar el nodo dentro de '\ snode \ s' con cualquier otro nombre de proceso.

Hamid Tavakoli
fuente
2
alternativamente, siempre puede intentar: ps -ef | grep "nodo" | awk '{print $ 2}' | xargs kill -9
frymaster
Parece funcionar pero no me devuelve correctamente a un aviso. Pensamientos?
Abogado del Diablo
25

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 ...

  1. Dé el comando fgpara reanudar el proceso en primer plano.

  2. escriba Ctrl+ Cpara matarlo correctamente.


Alternativamente, puede matarlo manualmente de esta manera:

( NOTA: los siguientes comandos pueden requerir root, también sudo ...tu amigo)

pkill -9 node

o, si no tiene pkill, esto puede funcionar:

killall node

o tal vez esto:

kill $(ps -e | grep node | awk '{print $1}')

a veces el proceso enumerará su propio grep, en cuyo caso necesitará:

kill $(ps -e | grep dmn | awk '{print $2}')

.


h / t @ruffin de los comentarios sobre la pregunta en sí. Tuve el mismo problema y su comentario me ayudó a resolverlo yo mismo.

Metagrafo
fuente
22

puede escribir .exit para salir del nodo js REPL

soleado1304
fuente
2
Para empezar, se supone que estás en REPL . ¿Qué sucede si tengo un script de Nodo ejecutándose?
IgorGanapolsky
18

Si está ejecutando Node.js de forma interactiva (REPL):

Ctrl+ Clo llevará de regreso a> prompt y luego escriba:

process.exit()

o simplemente use Ctrl+ D.

sr77in
fuente
17

$ sudo killall nodeen otro terminal funciona en mac , mientras killall nodeno funciona:

$ killall node
No matching processes belonging to you were found
Maxim Yefremov
fuente
13

en linux intente: pkill node

en ventanas:

Taskkill /IM node.exe /F

o

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])
Jason
fuente
5

Aunque esta es una respuesta tardía, encontré esto en los documentos de NodeJS :

El evento de 'salida' se emite cuando se sale de REPL al recibir el .exitcomando como entrada, el usuario presiona <ctrl>-Cdos veces para señalar SIGINT o al presionar <ctrl>-Dpara señalar 'fin' en la secuencia de entrada. La devolución de llamada del oyente se invoca sin ningún argumento.

Para resumir, puede salir por:

  1. Escribiendo .exiten nodejs REPL.
  2. Presionando <ctrl>-Cdos veces.
  3. presionando <ctrl>-D.
  4. 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.
  5. process.kill(process.pid) es la forma de matar usando la API de nodejs desde su código o desde REPL.
randominstanceOfLivingThing
fuente
5

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 foreverpaquete (from NPM).

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.

Descifrado
fuente
2

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 nodellamada sea lo más específica posible. Por ejemplo, en lugar de llamar node server.jsdesde 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 nodecomo otros han mencionado.

bapin93
fuente
2

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.

Robert Molina
fuente
2

puede trabajar siguiendo el comando para ser específico en localserver kill (aquí: 8000)

http: // localhost: 8000 / kill PID (processId):

$:lsof -i tcp:8000

Le dará los siguientes grupos de TCP:

COMANDO PID USUARIO TIPO FD TAMAÑO DEL DISPOSITIVO / NOMBRE APAGADO

nodo 21521 ubuntu 12u IPv6 345668 0t0 TCP *: 8000 (ESCUCHAR)

$:kill -9 21521

Eliminará el Id. De proceso correspondiente a TCP *: 8000

Ank_247shbm
fuente
2

Para MacOS

  1. Terminal abierta
  2. Ejecute el siguiente código y presione enter

     sudo kill $(sudo lsof -t -i:4200)
Siddhant Senapati
fuente
2

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:

fuser <<target_port>>/tcp

Digamos que el puerto es 8888, el comando se convierte en:

fuser 8888/tcp

Y para eliminar un proceso que se ejecuta en un puerto, simplemente agregue el conmutador -k.

fuser <<target_port>>/tcp -k

Ejemplo (el puerto es 8888):

fuser 8888/tcp -k

¡Eso es! Cerrará el proceso escuchando en el puerto. Normalmente hago esto antes de ejecutar mi aplicación de servidor.

Vikram Bankar
fuente
1

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?

Edan Chetrit
fuente
0

Para Windows, primero busque el PID con su número de puerto

netstat -ano | findStr "portNumber"

Después de eso, elimine la tarea, asegúrese de estar en la raíz de su unidad "c" ingrese la descripción de la imagen aquí y el comando serátaskkill /F /PID your pid

gem007bd
fuente
0

Si está utilizando VS Code y terminal, seleccione el nodo del menú desplegable del lado derecho primero y luego haga Ctrl + C. Luego funcionará

ingrese la descripción de la imagen aquí

Presione y cuando se le solicite.

ingrese la descripción de la imagen aquí

Gracias

MindRoasterMir
fuente