具体来说,我正在尝试使用结构来运行一些依赖于MongoDB存在的测试。
我有以下代码:
db_cmd = 'mongod'
test_cmd = 'istanbul cover node_modules/mocha/bin/_mocha -- -R spec'
pid = os.spawnl(os.P_NOWAIT, db_cmd)
with shell_env(NODE_ENV='test'):
local(test_cmd)
我计划在test_cmd
完成后使用 PID 终止该过程,但我还没有走那么远。
运行test_cmd
会导致错误,表明db_cmd
已退出并且MongoDB不再可用:
Uncaught Error: failed to connect to [localhost:27017]
但是,在运行结构之前手动运行mongod
会导致test_cmd
运行良好并与MongoDB交互。
怀疑我只是不明白os.spawnl
.请注意,这段代码需要在Windows/Linux和OSX上运行,所以我认为我可以使用哪些os.spawnxxx
方法受到了一些限制。我也有兴趣知道是否有一种织物方法也可以实现这一目标。
我成功地使用了:
os.killpg(process.pid, signal.SIGTERM)
可能,您需要为此使用子流程模块。
要在后台运行 mongo:
process = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True, preexec_fn=os.setsid
)
要在测试后杀死它,请使用我首先编写的命令。
命令 - 是包含 mongo 启动代码的字符串,例如:
mongod --host localhost --port 27018
它对我来说效果很好。如果您在使用代码时遇到问题,请告诉我。
你也可以用作业和陷阱直接抨击
: #!/bin/bash
trap "kill %1" SIGINT SIGTERM EXIT
mongod --host localhost --port 27018 &
istanbul cover node_modules/mocha/bin/_mocha -- -R spec
exit 0
这是在做什么:
- 在信号上设置陷阱,SIGINT SIGTERM出口,以杀死第一个后台作业
- 创建一个 mongod 实例,并将其扔到后台(第一个)
- 运行测试
- 触发退出信号
因此,这将在完成时设置并降低您的 mongod 实例,即使在期限信号或异常上也是如此。