【发布时间】:2019-03-21 18:50:31
【问题描述】:
我使用Jest 作为测试库,在它的setup hook(在我的所有测试之前执行)内部,我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 与 shell 中显示的不同。如果不在后台执行它,我会得到一个额外的进程,即 shell 的进程 (/bin/sh)。
我怎样才能获得该进程的真实 PID?
有没有最好的方法来终止该函数内启动的进程?
谢谢!
【问题讨论】:
标签: node.js child-process