2016-05-16 16 views
0

gerritイベントをsshコマンドで監視しようとしています。コマンドは次のとおりです。ssh接続をデーモンとして実行

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

私は別のports上で実行されている様々なgerritのインスタンスを監視し、これらのgerritインスタンスから受信したイベントにさらなる分析を実行する必要があります。私はpythonを使ってコードを使ってやりたいと思います。これらのさまざまな接続を複数のプロセスとして実行することを検討しましたが、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() 

これは最初のgerrit例えばsshコマンドを実行しているコントロールが機能client_setupから上記のコード片に戻って来ていないと屋台が接続を確立し、あらゆる可能性をキャプチャするために待って動作しませんでしたイベント。したがって、他の実行中のインスタンスはすべてキャプチャされません。

また、毎回get_running_instances関数は、異なる実行セットのgerritインスタンスを返します。それで、私は一度にすべてのプロセスを作成することはできません。

私は同じことを達成するために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

私は、マルチプロセッシングは主に、他のPythonインタプリタとの間でPyononicなやりとりや通信を行うために設計されていると思います。代わりに、Popen()メソッドを使用して、下位レベルのサブプロセスモジュールを使用する必要があります。 plumbumやTwistedのようなサードパーティのライブラリを使うことで、厄介な並列ストリームバッファの消費を取り除く手助けができます。私は、「プロセス間通信とネットワーク」のPython 3 asyncioサブプロセスメソドロジについての知識はまだありませんが、Python 3を実行している場合はそれも簡単です。

さらに別の方法として、sshクライアントをネイティブに実行してみてくださいPythonを使用しています。私はそれが複数の接続のためのビルトインの非同期サポートを持っているとは思わないので、あなたはそれをすべてあなた自身に向ける必要があります。

+0

私は 'asyncio'を調べます。私のユースケースに合っているようだ。ありがとうございました。 – nidHi

+0

また、 'parallel-ssh'はこのユースケースにとって良いものでしょうか? – nidHi

+0

私はparallel-sshを使用していませんが、かなりアクティブに見え、その代替案に対して有効な議論をしています。おそらくあなたが使用しているPythonのインストールと一緒にgeventをインストールして使用することができれば、エントリーの障壁が最も低いオプションのように聞こえます。 Parallel sshがまだpython 3をサポートしていないというスレッドがあります。なぜなら、geventはまだそれを広範にサポートしていないからです。 – parity3

0

あなたは実行している:

proc.start() 
proc.join() 

最初のものは、あなたの新しいプロセスを開始します。もう1人はそれが完了するのを待ちます。イベントをストリーミングしたいので、そのプロセスを実行したままにしておき、それを待ってはいけません。

proc.join()を削除するだけで、主な問題を取り除くことができます。 (またはクリーンアップコードに移動する)

+0

すべてのプロセスに対して1つの 'join'を試しました。しかし、 'gerrit' ssh接続はブロッキング呼び出しであり、それ以上の実行はできません。 – nidHi

関連する問題