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