Ecco un'altra soluzione che mescola idee dalle risposte precedenti. Adotta l'approccio del "processo di uccisione" mentre affronta la preoccupazione per l'indipendenza dalla piattaforma.
Si basa sul pacchetto tree-kill per gestire l'uccisione dell'albero dei processi del server. Ho trovato che uccidere l'intero albero dei processi è necessario nei miei progetti perché alcuni strumenti (ad esempio babel-node
) generano processi figlio. Se hai solo bisogno di uccidere un singolo processo, puoi sostituire tree-kill con il process.kill()
metodo integrato .
La soluzione segue (i primi due argomenti spawn()
da modificare per riflettere la ricetta specifica per l'esecuzione del server):
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"
}
Si noti che questa soluzione scollega lo script di avvio dal server (ovvero npm start
tornerà immediatamente e non si bloccherà fino a quando il server non verrà arrestato). Se preferisci il comportamento di blocco tradizionale, rimuovi semplicemente l' options.detached
argomento a spawn()
e la chiamata a child.unref()
.