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