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



具体来说,我正在尝试使用结构来运行一些依赖于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 实例,即使在期限信号或异常上也是如此。

最新更新