Hier ist eine weitere Lösung, die Ideen aus den vorherigen Antworten mischt. Es wird der "Kill-Prozess" -Ansatz verfolgt, während die Bedenken hinsichtlich der Plattformunabhängigkeit ausgeräumt werden.
Es basiert auf dem Tree-Kill- Paket, um das Beenden des Server-Prozessbaums zu handhaben. Ich fand es in meinen Projekten notwendig, den gesamten Prozessbaum zu beenden, da einige Tools (z. B. babel-node
) untergeordnete Prozesse erzeugen. Wenn Sie nur einen einzelnen Prozess beenden müssen, können Sie Tree-Kill durch die integrierte process.kill()
Methode ersetzen .
Die Lösung lautet wie folgt (die ersten beiden Argumente spawn()
sollten geändert werden, um das spezifische Rezept für die Ausführung Ihres Servers widerzuspiegeln):
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"
}
Beachten Sie, dass diese Lösung das Startskript vom Server trennt (dh npm start
sofort zurückkehrt und nicht blockiert, bis der Server gestoppt wird). Wenn Sie das traditionelle Blockierungsverhalten bevorzugen, entfernen Sie einfach das options.detached
Argument spawn()
und den Aufruf von child.unref()
.