具体来说,我正在尝试使用fabric运行一些依赖于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]
然而,在运行fabric之前手动运行mongod
会导致test_cmd
正常运行并与MongoDB交互。
我怀疑我只是不理解os.spawnl
。请注意,此代码需要在Windows / Linux和OSX上运行,因此我认为我可以使用哪些os.spawnxxx
方法受到限制。我也有兴趣知道是否有一种结构方法来实现这一点。
答案 0 :(得分:2)
我成功使用:
os.killpg(process.pid, signal.SIGTERM)
可能你需要使用子进程模块。
在后台使用中运行mongo:
process = subprocess.Popen(
command, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
shell=True, preexec_fn=os.setsid
)
要在测试后杀死它,请使用我先写过的命令。
command - 是包含mongo开始代码的字符串,例如:
mongod --host localhost --port 27018
对我来说很好。如果您对代码有疑问,请告诉我。
答案 1 :(得分:0)
您也可以使用作业和陷阱进行直接打击:
#!/bin/bash
trap "kill %1" SIGINT SIGTERM EXIT
mongod --host localhost --port 27018 &
istanbul cover node_modules/mocha/bin/_mocha -- -R spec
exit 0
这是做什么的:
因此,这将在完成时设置并削减你的mongod实例,即使在术语信号或异常时也是如此。