2014-02-27 42 views
0

具体来说,我试图使用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) 

我打算使用PID后test_cmd已经完成,但是我还没有得到那么远,杀死进程。

test_cmd导致一个错误提示db_cmd已退出和正在运行的MongoDB是不再可用:

Uncaught Error: failed to connect to [localhost:27017] 

运行织物之前手动然而运行mongod导致test_cmd运行细并用MongoDB的交互。我想我只是不理解os.spawnl。请注意,此代码需要在Windows/Linux和OSX上运行,因此我认为我可以使用哪些os.spawnxxx方法受到某种限制。我也很想知道是否还有一种结构方法可以实现这一点。

回答

2

我成功地使用:

os.killpg(process.pid, signal.SIGTERM) 

也许,你需要使用子模块这一点。

在后台运行使用蒙戈:

process = subprocess.Popen(
     command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
     shell=True, preexec_fn=os.setsid 
    ) 

要测试之后杀死它,使用命令我已经先写入。

命令 - 是一个字符串包含您蒙戈启动代码,例如:

mongod --host localhost --port 27018 

它工作正常的我。如果您在代码方面存在问题,请告诉我。

+0

完美,谢谢! – DanH

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 

这是什么做的:

  • 设置的信号,SIGINT SIGTERM EXIT,一个陷阱杀第一backgrond工作
  • 拨打的mongod实例,并扔到后台(第一个)
  • 运行测试
  • 触发器退出信号

因此,这将设置并完成您的mongod实例,即使是在一个术语信号或异常情况下也是如此。