2016-05-16 92 views
0

我試圖通過ssh命令監視gerrit事件。該命令如下。作爲守護進程運行ssh連接

ssh -p 29418 review.example.com gerrit stream-events 

我需要監視在不同ports運行的各種這樣gerrit實例和對從這些gerrit實例接收到的事件執行進一步的分析。我想通過使用python的代碼來完成。我考慮將這些各種ssh連接作爲多個進程運行,爲此我使用multiprocessingpython程序包試圖使用daemon屬性來運行該進程,作爲daemon。以下是我的代碼片段。

import multiprocessing as mp 

class MyProcess(mp.Process): 
    def __init__(self, target, args): 
     mp.Process.__init__(self, target=target, args=args) 

while True: 
    running = get_runnig_instances() #get all the running gerrit instances 
    for instance in running: 
     port_num = instance.port 
     url = instance.ip 
     proc = MyProcess(target=client_setup, args=(url,port_num,)) #client_setup(url,port_num) is a function that runs the command for the ssh connection to stream gerrit events 
     proc.daemon = True 
     proc.start() 
     proc.join() 

這並沒有爲運行SSH命令第一gerrit實例的控制不從功能client_setup回到上面這段代碼和攤位那裏建立連接,等待捕捉任何可能的工作後,事件。因此,任何其他正在運行的事件都不會被捕獲。

而且,get_running_instances函數每次都返回一組不同的運行實例。因此,我無法一次創建所有流程。

我也試過用daemon包來達到同樣的效果。以下是代碼片段。

import multiprocessing as mp 
import daemon 

class MyProcess(mp.Process): 
    def __init__(self, target, args): 
     mp.Process.__init__(self, target=target, args=args) 

while True: 
    running = get_runnig_instances() #get all the running gerrit instances 
    for instance in running: 
     port_num = instance.port 
     url = instance.ip 
     with daemon.DaemonContext(): 
      proc = MyProcess(target=client_setup, args=(url,port_num,)) #client_setup(url,port_num) is a function that runs the command for the ssh connection to stream gerrit events 
      proc.start() 
      proc.join() 

我在這裏面臨同樣的問題。我如何去做這件事?我不確定我做錯了什麼,需要幫助。

對於廣泛的解釋抱歉。

回答

1

我認爲多處理主要是爲了產卵和以pythonic方式與其他python解釋器進行通信。您可能需要使用較低級別的子流程模塊,而使用Popen()方法。您可以通過使用第三方庫(如鉛)甚至扭曲來幫助擺脫煩人的並行流緩衝區消耗。我對「進程間通信和網絡」下的Python 3 asyncio子進程方法知之甚少,但如果您正在運行Python 3,也可能使事情變得更容易。

還有另一種選擇是嘗試在本地運行ssh客戶端python,使用paramiko。我不認爲它內置了對多個連接的異步支持,因此您可能必須自己完成這一切。

+0

我會查看'asyncio'。它似乎適合我的用例。謝謝。 – nidHi

+0

另外,對於這種用例,'parallel-ssh'會有什麼用處? – nidHi

+0

我沒有使用parallel-ssh,但它似乎相當活躍,並針對其替代方案提出了有效的論點。聽起來可能是最不可能進入的選項,前提是你可以安裝和使用你使用的任何python安裝的gevent。有一個線程聲明Parallel ssh還不支持python 3,因爲gevent還沒有廣泛的支持,儘管我沒有看到他們很快就不能支持它。 – parity3

0

您正在運行:

proc.start() 
proc.join() 

第一個啓動的新進程。第二個等待它完成。因爲您想要傳輸事件,所以您希望讓該進程繼續運行,而不是等待它。

您可以通過刪除proc.join()來擺脫主要問題。 (或將其移動到清理代碼)

+0

我爲所有進程嘗試了一個'join'。然而'gerrit' ssh連接是阻塞調用,不會讓任何進一步的執行。 – nidHi

相關問題