2016-05-16 100 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

相关问题