作为守护程序运行ssh连接

时间:2016-05-16 06:29:11

标签: python ssh daemon gerrit python-multiprocessing

我正在尝试通过gerrit命令监视ssh个事件。命令如下。

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

我需要监视在不同gerrit上运行的各种此类ports实例,并对从这些gerrit实例收到的事件进行进一步分析。我想通过代码使用python来完成。我考虑将这些不同的ssh个连接作为多个进程运行,为此,我使用multiprocessing python包尝试使用daemon属性将进程作为{{{}运行1}}。下面是我的代码片段。

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实例事件。

此外,gerrit函数每次返回一组不同的运行get_running_instances实例。因此,我无法一次创建所有流程。

我还尝试使用gerrit包来实现同样的目标。以下是代码的片段。

daemon

我在这里遇到了同样的问题。我该怎么做?我不确定我做错了什么,需要帮助。

对于广泛的解释感到抱歉。

2 个答案:

答案 0 :(得分:1)

我认为多处理主要是为了以pythonic方式产生和与其他python解释器进行通信而设计的。您可能需要使用Popen()方法来使用较低级别的子进程模块。您可以通过使用第三方库(如plumbum,甚至Twisted)来帮助摆脱烦人的并行流缓冲区消耗。我对“进程间通信和网络”下的Python 3 asyncio子进程方法知之甚少,但如果运行Python 3,这可能会使事情变得更容易。

另一个选择是尝试在python中本地运行ssh客户端,使用paramiko。我不认为它有多个连接的内置异步支持,所以你可能不得不自己探测。

答案 1 :(得分:0)

你正在跑步:

proc.start()
proc.join()

第一个开始你的新过程。第二个等待它完成。因为您想要流式传输事件,所以您希望让该进程保持运行,而不是等待它。

只需删除proc.join()即可摆脱主要问题。 (或将其移至清理代码)