运行后台进程,然后在进行一些中间处理后将其终止

时间:2014-02-27 06:03:09

标签: python background-process fabric

具体来说,我正在尝试使用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方法受到限制。我也有兴趣知道是否有一种结构方法来实现这一点。

2 个答案:

答案 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

这是做什么的:

  • 设置陷阱信号,SIGINT SIGTERM EXIT,以终止第一个背景作业
  • 创建一个mongod实例,并将其扔到后台(第一个)
  • 运行测试
  • 触发退出信号

因此,这将在完成时设置并削减你的mongod实例,即使在术语信号或异常时也是如此。