Я использую Jest в качестве библиотеки тестирования и внутри установочного хука (который выполняется перед всеми моими тестами), я spawn дочерний процесс который запускает тестовый сервер на определенном порту.
Код установки в основном выполняет команду NPM:
"run-server-test": "NODE_ENV=test SERVER_PORT=3001 node src/index.js &",
"test": "NODE_ENV=test SERVER_PORT=3001 jest --detectOpenHandles --forceExit",
А это функция настройки:
const { spawn } = require("child_process")
module.exports = async function setup() {
return new Promise((resolve, reject) => {
const testServerProcess = spawn("npm", ["run", "run-server-test"])
testServerProcess.on("error", err => {
console.log("Failed to start subprocess.", err)
reject(err)
})
testServerProcess.stdout.on("data", data => {
if (data.toString().startsWith("Apollo Server")) {
console.log(`\nTest server running with PID ${testServerProcess.pid}`)
resolve(true)
}
})
testServerProcess.stderr.on("data", data => {
console.error(`stderr: ${data}`)
reject(new Error(data.toString()))
})
})
}
Обратите внимание, что я выполняю команду в фоновом режиме с &
. Когда Jest заканчивает свою работу, я отмечаю ps
, что его PID отличается от показанного в оболочке. Не выполняя его в фоновом режиме, я получаю дополнительный процесс - оболочку (/bin/sh
).
Как я могу получить реальный PID этого процесса?
Есть ли лучший способ убить процесс, запущенный внутри этой функции?
Спасибо!