在处理完一个中间进程后再运行它

2024-04-25 22:29:15 发布

您现在位置:Python中文网/ 问答频道 /正文

具体来说,我尝试使用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不再可用:

^{pr2}$

但是,在运行fabric之前手动运行mongod,会导致test_cmd正常运行并与MongoDB交互。在

我怀疑我只是不明白os.spawnl。注意,这段代码需要在Windows/Linux和OSX上运行,所以我认为我在使用os.spawnxxx方法方面受到了一定的限制。我也很想知道是否有一种织物方法可以实现这一点。在


Tags: 方法代码testcmdmodulesnodedbos
2条回答

我成功地使用了:

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

可能,您需要使用subprocess模块来实现这一点。在

要在后台运行mongo,请使用:

^{pr2}$

要在测试后杀死它,请先使用我编写的命令。在

command-是包含mongo start代码的字符串,例如:

mongod  host localhost  port 27018

对我来说很好。如果你对代码有问题,请告诉我。在

您也可以在直接使用作业和陷阱的bash中执行此操作:

 #!/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实例的皮重,即使是在一个术语信号或异常情况下。在

相关问题 更多 >