Saltar al contenido

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

Solución:

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

Puede hacer esto realmente simple si se establece en 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 pm2 o algo que automáticamente manejó esto sobre la base de un git push.

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: sus cosas habituales de Express se encuentran aquí

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.

Cuando probé la solución sugerida, me di cuenta de que el nombre de mi aplicación estaba truncado. Leí sobre process.title en 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 comandos 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.json expediente

  "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 start y npm stop trabajo, por supuesto npm stop siempre terminará todos los procesos en ejecución, pero eso está bien para mí.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *