Oto kolejne rozwiązanie, które łączy pomysły z poprzednich odpowiedzi. Podejście typu "zabij proces" przy jednoczesnym uwzględnieniu obaw dotyczących niezależności platformy.
Opiera się na pakiecie tree-kill, aby poradzić sobie z zabiciem drzewa procesów serwera. Zauważyłem, że zabicie całego drzewa procesów jest niezbędne w moich projektach, ponieważ niektóre narzędzia (na przykład babel-node
) odradzają procesy potomne. Jeśli chcesz zabić tylko jeden proces, możesz zamienić zabijanie drzewa za pomocą wbudowanej metody process.kill()
.
Rozwiązanie następująco (pierwsze dwa argumenty spawn()
powinny zostać zmienione w celu odzwierciedlenia specyficzną recepturę działa serwer):
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"
}
Należy zauważyć, że rozwiązanie to odłącza skrypt startowy z serwera (tj npm start
powróci natychmiast i nie będzie blokowany, dopóki serwer nie zostanie zatrzymany). Jeśli wolisz tradycyjne blokowanie, po prostu usuń argument options.detached
do spawn()
, a połączenie do child.unref()
.
Dokładnie podążyłem za twoją instrukcją, ale dostałem błąd. Co zrobiłem źle? Czy możesz rzucić okiem? Edytuję pytanie, aby uwzględnić błąd. Dzięki! – ngungo
@ngungo spróbuj 'pkill'. –
Nadal mam błąd. Oczywiście jestem dobrze zorientowany w komendach liniowych. – ngungo