2016-09-09 2 views
0

파이썬 스크립트에서 알 수없는 수의 호스트 (한 호스트에서 수백 개까지있을 수 있음)에서 명령을 원격으로 실행하려고합니다. 이 일의 간단한 방법은 다음과 같다,하지만 분명히 엄청나게 많은 호스트와 시간이 소요 얻을 수 있습니다 : Python - 원격으로 프로세스를 병렬로 실행하고 출력을 검색하는 방법

listOfOutputs = [] 
for host in listOfHosts: 
    output = subprocess.Popen(shlex.split("ssh %s '<command>'" % host), stdout = subprocess.PIPE).communicate()[0] 
    listOfOutputs.append(output) 

이 같은 일을 할 수있는 방법이 있나요하지만, 명령을 원격으로하므로 병렬로 실행이 오래 걸리지 않을까요?

답변

0

메인 프로그램을 차단하지 않고 원하는만큼 실행할 수 있도록 각각의 스레드에서 Popen.subprocess 호출을 실행해야합니다.

호스트가 될 수있는만큼 많은 스레드를 생성하는 작은 예제를 만들었습니다. 스레드 이후 더 큰 문제는 대부분 내 예에서 호스트 응답 (다른, 스레드 풀은 더 좋았을 것)

을 기다리는 것, 나는 3 개 호스트를 가지고 있고, 나는 각 하나에 ping을 수행합니다. 출력은 스레드로부터 안전한 출력 목록에 저장되고 끝에 인쇄됩니다.

import threading 
import subprocess 

listOfOutputs=[] 

lock = threading.Lock() 

def run_command(args): 
    p = subprocess.Popen(["ping","-n","1",args],stdout = subprocess.PIPE) 
    output,err = p.communicate() 
    lock.acquire() # listOfOutputs is thread-safe now 
    listOfOutputs.append(args+": "+output) 
    lock.release() 

threads=[] 
listOfHosts = ['host1','host2','host3'] 
for host in listOfHosts: 
    t = threading.Thread(target=run_command,args=[host]) 
    t.start()   # start in background 
    threads.append(t) # store thread object for future join operation 


[t.join() for t in threads] # wait for all threads to finish 

# print results 
for o in listOfOutputs: 
    print(o) 
    print("-"*50) 
관련 문제