Aqui está outra solução que mistura ideias das respostas anteriores. Ele adota a abordagem de "processo de eliminação" enquanto trata da preocupação com a independência da plataforma.
Ele depende do pacote tree-kill para lidar com a eliminação da árvore de processos do servidor. Descobri que matar toda a árvore de processos é necessário em meus projetos porque algumas ferramentas (por exemplo babel-node
) geram processos filhos. Se você só precisa matar um único processo, você pode substituir tree-kill com o built-inprocess.kill()
método .
A solução é a seguinte (os primeiros dois argumentos para spawn()
devem ser modificados para refletir a receita específica para executar seu 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"
}
Observe que esta solução desconecta o script de inicialização do servidor (ou seja npm start
, retornará imediatamente e não bloqueará até que o servidor seja interrompido). Se você preferir o comportamento de bloqueio tradicional, simplesmente remova o options.detached
argumento para spawn()
e a chamada para child.unref()
.