我正在尝试通过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
我在这里遇到了同样的问题。我该怎么做?我不确定我做错了什么,需要帮助。
对于广泛的解释感到抱歉。
答案 0 :(得分:1)
我认为多处理主要是为了以pythonic方式产生和与其他python解释器进行通信而设计的。您可能需要使用Popen()方法来使用较低级别的子进程模块。您可以通过使用第三方库(如plumbum,甚至Twisted)来帮助摆脱烦人的并行流缓冲区消耗。我对“进程间通信和网络”下的Python 3 asyncio子进程方法知之甚少,但如果运行Python 3,这可能会使事情变得更容易。
另一个选择是尝试在python中本地运行ssh客户端,使用paramiko。我不认为它有多个连接的内置异步支持,所以你可能不得不自己探测。
答案 1 :(得分:0)
你正在跑步:
proc.start()
proc.join()
第一个开始你的新过程。第二个等待它完成。因为您想要流式传输事件,所以您希望让该进程保持运行,而不是等待它。
只需删除proc.join()
即可摆脱主要问题。 (或将其移至清理代码)