2014-02-27 78 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實例,即使是在一個術語信號或異常情況下也是如此。