2011-06-22 13 views
5

Próbuję użyć modułu python paramiko (1.7.7.1) do wykonywania poleceń i/lub plików xfer do grupy zdalnych serwerów równolegle. Jednym z zadań wygląda następująco:Moduł wieloprocesowy z paramiko

jobs = [] 
for obj in appObjs: 
    if obj.stop_app: 
     p = multiprocessing.Process(target=exec_cmd, args=(obj, obj.stop_cmd)) 
     jobs.append(p) 
     print "Starting job %s" % (p) 
     p.start() 

"obj" zawiera, między innymi, paramiko SSHClient, transport i SFTPClient. Lista appObjs zawiera około 25 z tych obiektów, a więc 25 połączeń z 25 różnymi serwerami.

pojawia się następujący błąd z transport.py paramiko w backtrace

raise AssertionError("PID check failed. RNG must be re-initialized after fork(). 
Hint: Try Random.atfork()") 

I połatany /usr/lib/python2.6/site-packages/paramiko/transport.py opartej na stanowisku w https://github.com/newsapps/beeswithmachineguns/issues/17 ale wydaje się, że nie pomogło. Sprawdziłem, że transport.py w ścieżce wymienionej powyżej jest tą używaną. Lista mailingowa paramiko prawdopodobnie zniknęła.

Czy to wygląda na problem w paramiko, czy też nie rozumiem/nie stosuję modułu wieloprocesorowego? Czy ktoś chciałby zaproponować praktyczne rozwiązanie? Wielkie dzięki,

Odpowiedz

5

UPDATE: W @ento notatek, rozwidloną pakiet ssh został merged back into paramiko więc poniżej odpowiedź jest teraz nieistotne i należy teraz jest za pomocą Paramiko ponownie.

Jest to znany problem w Paramiko-który został ustalony w rozwidleniu Paramiko (utknęły w wersji 1.7.7.1), która jest teraz po prostu znany jako ssh package on pypi (która przynosi rzeczy do wersji 1.7.11 dzień to pisanie).

Najwyraźniej były problemy coraz kilka ważnych poprawek do głównego nurtu Paramiko i opiekun był nie reagują, więc @bitprophet, opiekun tkaniny rozwidlone Paramiko pod nową nazwą pakietu ssh package on pypi. Możesz zobaczyć konkretny problem, o którym wspomniałeś, że jest discussed here i jest jednym z powodów, dla których zdecydował się go rozwikłać; możesz przeczytać gory details, jeśli naprawdę chcesz.

+2

+1 głównie dlatego, że nie wiem Paramiko zostały wyparte przez użytkownika @ bitprophet pakietu ssh –

+1

Pakiet ssh na PyPI (testowane w wersji 1.7.11, 1.7.13) podaje ten sam błąd, o którym mowa w pytaniu, przynajmniej w Pythonie 2.7.1. – ifischer

+1

Pakiet ssh na pypi [został połączony z powrotem w górę] (http://bitprophet.org/blog/2012/09/29/paramiko-and-ssh/) od paramiko v1.8.0 – ento

1

Jako jeden komentarz wewnątrz Paramiko issue wspomina, błąd RNG można uniknąć, otwierając jeden oddzielny uchwyt ssh na proces, wtedy paramiko nie będzie narzekać już. Ten skrypt pokazuje to (używam Pool zamiast procesy):

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import ssh 
from multiprocessing import Pool 
import getpass 

hostnames = [HOST1, HOST2] 
user = USERNAME 
pw = getpass.getpass("Enter ssh password:") 

def processFunc(hostname): 
    handle = ssh.SSHClient() 
    handle.set_missing_host_key_policy(ssh.AutoAddPolicy()) 
    handle.connect(hostname, username=user, password=pw) 
    print("child") 
    stdin, stdout, stderr = handle.exec_command("ls -l /var/log; sleep 5") 
    cmdOutput = "" 
    while True: 
     try: 
      cmdOutput += stdout.next() 
     except StopIteration: 
      break 
    print("Got output from host %s:%s" % (hostname, cmdOutput)) 
    handle.close() 

pool = Pool(len(hostnames)) 
pool.map(processFunc, hostnames, 1) 
pool.close() 
pool.join() 

## If you want to compare speed: 
# for hostname in hostnames: 
#  processFunc(hostname) 
Powiązane problemy