Cómo detener la aplicación que node.js expresa 'npm start'

100

Usted crea la aplicación node.js con express v4.x y luego inicia su aplicación en npm start . Mi pregunta es ¿cómo detener la aplicación? ¿Hay parada npm ?

EDITAR para incluir el error al implementar npm stop

/home/nodetest2# npm stop

> nodetest2@0.0.1 stop /home/nodetest2
> pkill -s SIGINT nodetest2

pkill: invalid argument for option 's' -- SIGINT

npm ERR! nodetest2@0.0.1 stop: `pkill -s SIGINT nodetest2`
npm ERR! Exit status 2
ngungo
fuente

Respuestas:

66

Sí, npm también proporciona un script de detención:

npm help npm-scripts

prestop, stop, poststop: Ejecutado por el comando npm stop.

Configure uno de los anteriores en su package.json, y luego use npm stop

npm help npm-stop

Puedes hacer esto realmente simple si te preparas app.js,

process.title = myApp;

Y luego, en scripts.json,

"scripts": {
    "start": "app.js"
    , "stop": "pkill --signal SIGINT myApp"
}

Dicho esto, si este fuera yo, estaría usando pm2o algo que automáticamente manejó esto sobre la base de un git push.

Evan Carroll
fuente
Todavía tengo un error. Obviamente, estoy bien versado en los comandos de línea.
ngungo
@ngungo más bien --signal. Úselo man pkillpara leer sobre pkill.
Evan Carroll
3
@EvanCarroll ¿Qué sucede si se ejecutan varias instancias de la aplicación?
Amit Kumar Gupta
1
Alguna idea de cómo implementar esto en la aplicación angular 4. Específicamente, ¿dónde configuro el título del proceso?
kiranghule27
40

Todas las demás soluciones aquí dependen del sistema operativo. Una solución independiente para cualquier sistema operativo usa socket.io de la siguiente manera.

package.json tiene dos guiones:

"scripts": {
  "start": "node server.js",
  "stop": "node server.stop.js"
}

server.js: aquí vive su contenido express habitual

const express = require('express');
const app = express();
const server = http.createServer(app);
server.listen(80, () => {
  console.log('HTTP server listening on port 80');
});

// Now for the socket.io stuff - NOTE THIS IS A RESTFUL HTTP SERVER
// We are only using socket.io here to respond to the npmStop signal
// To support IPC (Inter Process Communication) AKA RPC (Remote P.C.)

const io = require('socket.io')(server);
io.on('connection', (socketServer) => {
  socketServer.on('npmStop', () => {
    process.exit(0);
  });
});

server.stop.js

const io = require('socket.io-client');
const socketClient = io.connect('http://localhost'); // Specify port if your express server is not using default port 80

socketClient.on('connect', () => {
  socketClient.emit('npmStop');
  setTimeout(() => {
    process.exit(0);
  }, 1000);
});

Pruébalo

npm start (iniciar su servidor como de costumbre)

npm stop (esto ahora detendrá su servidor en ejecución)

El código anterior no ha sido probado (es una versión reducida de mi código, mi código funciona) pero espero que funcione como está. De cualquier manera, proporciona la dirección general a seguir si desea utilizar socket.io para detener su servidor.

danday74
fuente
2
La belleza de este enfoque es que básicamente puede ejecutarlo en cualquier entorno, incluidos los contenedores, que suelen ser bastante restrictivos en cuanto a cómo manipular los procesos. Desde mi perspectiva muy personal, ese es el enfoque más elegante.
Der Zinger
16

Cuando probé la solución sugerida, me di cuenta de que el nombre de mi aplicación estaba truncado. Leí process.titleen la documentación de nodejs ( https://nodejs.org/docs/latest/api/process.html#process_process_title ) y dice

En Linux y OS X, está limitado al tamaño del nombre binario más la longitud de los argumentos de la línea de comando porque sobrescribe la memoria argv.

Mi aplicación no usa ningún argumento, por lo que puedo agregar esta línea de código a mi app.js

process.title = process.argv[2];

y luego agregue estas pocas líneas a mi package.jsonarchivo

  "scripts": {
    "start": "node app.js this-name-can-be-as-long-as-it-needs-to-be",
    "stop": "killall -SIGINT this-name-can-be-as-long-as-it-needs-to-be"
  },

para utilizar nombres de proceso realmente largos. npm starty el npm stoptrabajo, por supuesto npm stop, siempre terminará todos los procesos en ejecución, pero eso está bien para mí.


fuente
12

Este es un problema de versión mintty; alternativamente, use cmd. Para matar el proceso del servidor, simplemente ejecute este comando:

    taskkill -F -IM node.exe
Karan
fuente
1
no es una buena idea matar a main node.exe, ya que creará un problema en caso de que tenga varias aplicaciones de nodo en ejecución
user889030
11

En MAC OS X (/ BSD): puede intentar usar el comando lsof (listar archivos abiertos)

$ sudo lsof -nPi -sTCP:LISTEN

ingrese la descripción de la imagen aquí

y entonces

$ kill -9 3320
vencedor
fuente
9

Verifique con netstat -nptl todos los procesos

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      1736/mongod     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1594/sshd       
tcp6       0      0 :::3977                 :::*                    LISTEN      6231/nodejs     
tcp6       0      0 :::22                   :::*                    LISTEN      1594/sshd       
tcp6       0      0 :::3200                 :::*                    LISTEN      5535/nodejs 

Y simplemente mata el proceso por la referencia PID ... En mi caso, quiero detener el 6231 / nodejs, así que ejecuto el siguiente comando:

kill -9 6231
Samuel Ivan
fuente
1
Creo que el OP está buscando una opción de script NPM, no una consola.
Faraji Anderson
4

Aquí hay otra solución que combina ideas de las respuestas anteriores. Adopta el enfoque de "proceso de eliminación" al tiempo que aborda la preocupación por la independencia de la plataforma.

Se basa en el paquete tree-kill para manejar la eliminación del árbol de procesos del servidor. Encontré que es necesario matar todo el árbol de procesos en mis proyectos porque algunas herramientas (por ejemplo babel-node) generan procesos secundarios. Si solo necesita matar un proceso, puede reemplazar tree-kill con el process.kill()método incorporado .

La solución a continuación (los dos primeros argumentos spawn()deben modificarse para reflejar la receta específica para ejecutar su servidor):

build / start-server.js

import { spawn } from 'child_process'
import fs from 'fs'

const child = spawn('node', [
  'dist/server.js'
], {
  detached: true,
  stdio: 'ignore'
})
child.unref()

if (typeof child.pid !== 'undefined') {
  fs.writeFileSync('.server.pid', child.pid, {
    encoding: 'utf8'
  })
}

build / stop-server.js

import fs from 'fs'
import kill from 'tree-kill'

const serverPid = fs.readFileSync('.server.pid', {
  encoding: 'utf8'
})
fs.unlinkSync('.server.pid')

kill(serverPid)

package.json

"scripts": {
  "start": "babel-node build/start-server.js",
  "stop": "babel-node build/stop-server.js"
}

Tenga en cuenta que esta solución separa el script de inicio del servidor (es decir npm start, volverá inmediatamente y no se bloqueará hasta que se detenga el servidor). Si prefiere el comportamiento de bloqueo tradicional, simplemente elimine el options.detachedargumento ay spawn()la llamada a child.unref().

Rusty Shackleford
fuente
3

Si ya lo ha intentado ctrl + cy aún no funciona, es posible que desee probar esto. Esto me ha funcionado.

  1. Ejecute la línea de comandos como administrador. Luego ejecute el siguiente comando para encontrar el ID de proceso (PID) que desea eliminar. Escriba su número de puerto en<yourPortNumber>

    netstat -ano | findstr :<yourPortNumber>

ingrese la descripción de la imagen aquí

  1. Luego, ejecuta este comando después de haber identificado el PID.

    taskkill /PID <typeYourPIDhere> /F

ingrese la descripción de la imagen aquí

Felicitaciones a @mit $ ingh de http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157

Jamezuh
fuente
2

Si es muy simple, simplemente mata el proceso.

localmacpro$ ps
  PID TTY           TIME CMD
 5014 ttys000    0:00.05 -bash
 6906 ttys000    0:00.29 npm   
 6907 ttys000    0:06.39 node /Users/roger_macpro/my-project/node_modules/.bin/webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
 6706 ttys001    0:00.05 -bash
 7157 ttys002    0:00.29 -bash

localmacpro$ kill -9 6907 6906
rogersfo
fuente
1

Para la máquina con Windows (estoy en Windows 10), si el comando CTRL + C (Cancelar / Abortar) en cli no funciona, y la pantalla se muestra así:

ingrese la descripción de la imagen aquí

Intente presionar ENTER primero (o cualquier tecla lo haría) y luego CTRL + C y el proceso actual le preguntará si desea terminar el trabajo por lotes:

ingrese la descripción de la imagen aquí

Quizás CTRL + C solo termina el proceso principal mientras que npm start se ejecuta con otros procesos secundarios. Sin embargo, no estoy seguro de por qué tiene que presionar esa tecla adicional antes de CTRL + C, pero funciona mejor que tener que cerrar la línea de comando y comenzar de nuevo.

Es posible que desee comprobar un problema relacionado: https://github.com/mysticatea/npm-run-all/issues/74

Vincent Edward Gedaria Binua
fuente
0

Para entornos de producción, debe usar Forever.js

Es tan útil para iniciar y detener el proceso de nodo, también puede enumerar las aplicaciones en ejecución.

https://github.com/foreverjs/forever

Carlos Jesús Arancibia Taborga
fuente
0

En caso de que su archivo json no tenga un script para detener la aplicación, una opción que uso es simplemente presionando ctrl + C en el cmd.

Felipe
fuente
-1

Toda (3) solotion es:

1- ctlr + C

2- en el archivo json, escriba un script que se detenga

"scripts": {"stop": "killall -SIGINT este-nombre-puede-ser-tan-largo-como-necesita-ser"},

* que en el comando write // npm stop //

3- Reinicia la pc

Omar bakhsh
fuente
7
Reinicie la PC , ¿de verdad? ¿Por qué no girar el disyuntor principal? : D
stk
-2

Tienes que presionar la combinación ctrl + z Mi sistema operativo es Ubuntu

Тимур Сафаров
fuente