2017-12-25 15 views
-2

다음은 코드입니다. 계획은 범위에있는 모든 호스트를 핑 (ping)하여 fqdn을 다시 얻는 것입니다 ... 작동하지만, 시간이 오래 걸립니다 .... 그래서 멀티 프로세싱에 대해 생각합니다 ... 그러나 작동하지 않습니다. 코드는 p.map (...)에서 멈추고 그 이상으로 넘어 가지 않습니다. 누군가가 도움을 주시겠습니까? ............. 코드를 읽을 수있는 희망 ..멀티 스레드 딜레마

import subprocess 
import os 
import socket 
import multiprocessing 
from multiprocessing.dummy import Pool as ThreadPool 
from datetime import datetime 



range_85 = "10.85.40" 
range_87 = "10.87.40" 

print ("starting") 

replyfile = open("pingdns_replies.txt", "a") 
#replyfile.write("START %s \n" % datetime.now()) 

print("file opened") 


def ping(host): 
     print ("entered function") 
     #for ip in range (50,250): 
       #host = range_85 +"."+ str(ip) 
     print (host) 
     rep = subprocess.call("ping %s" % host, shell=False) 
     if rep == 0: 
       try: 
         dns = socket.getfqdn(host) 
       except: 
         dns = " " 
         print ("%s at %s is up" % (dns, host)) 
         replyfile.write(" %s at %s is up \n" % (dns, host)) 
     else: 
       try: 
         dns = socket.getfqdn(host) 
         print("%s at %s is down ?" % (dns, host)) 
         replyfile.write(" %s at %s is down ? \n" % (dns,host)) 
       except: 
         dns = " " 
         print ("%s received no reply" % host) 
         replyfile.write(" %s received no reply \n" % (dns, host)) 

#ips = (range_85 + "." + str(i) for i in range(0,255)) 

ips = [] 
for i in range(1,255): 
     ips.append(range_85+'.'+str(i)) 


print ("ips created") 
print (ips) 


with multiprocessing.Pool(2) as p:   
     p.map(ping, ips) 

replyfile.write("END %s \n" % datetime.now()) 
replyfile.close() 
+1

코드를 편집하여 읽기 쉽게하십시오. – chrisz

+0

http://idownvotedbecau.se/nomcve/ –

+0

'ping'을 서브 프로세스로 호출하는 경우 다중 처리가 필요하지 않습니다. 이미 여러 프로세스를 사용하고 있습니다. –

답변

0

이 코드는, 확실히 을 알고 열심히 그래서 불완전하지만 당신을 보인다 이 줄을 스캔 할 IP 목록을 만들려고 :

ips = range_85 +"."+ str('%d' % i for i in range(1,254)) 

, 당신은 문자열로 발전기 개체를 변환 실제로의 각 요소에서 문자열을 생성하지 않는 문제는 STR() 변환 함께 발전기

발전기를 생성하려면

ips = (range_85 + "." + str(i) for i in range(1,254)) 

난 여전히 IP 범위에서 유효한 당신의 IP 범위에서 0과 254을 제외한 것을주의해야한다 (당신이 그나마 경우에도 10.85 ping을 할 : IP 범위는 같은과 그 선을 대체 할 수 있습니다. 40.255) 범위 (0,255) 당신에게 전체 IP 범위 (문제가 완전히 여기 변경 주어진 255)

편집

새로운 질문에 대한 대답 exluding 줄 것입니다 :

https://linux.die.net/man/8/ping

:이

당신이 여기 핑의 문서를 참조 할 수있는 SIGINT에 의해 중지 될 때까지 핑 통화는 결코 "핑 xx.xx.xx.xx는"무기한 ICMP 패킷을 보낼 것입니다 적어도 리눅스에 반환

라인을 확실 임의 패킷 하시다 떨어질 수 있도록하려는 경우 하나 개 이상의 패킷을 전송해야 할 수

rep = subprocess.call("ping 1 %s" % host, shell=False) 

rep = subprocess.call("ping -c 1 %s" % host, shell=False) 

에 메모를 변경해보십시오 결과에 영향을주지 않습니다.

또한 2 개의 스레드 풀만 사용하는 것처럼 보이고 믿을 수 없을 정도로 리소스가 부족한 경우가 아니라면 (보통 PC를 사용하는 경우 수백 개가 넘을 수도 있음) ping 명령은 많은 CPU 전원을 필요로하지 않으며 단지 응답을 기다리는 응답이 거의 없습니다.

하나의 마지막 참고 사항 : 여러 위치에서 같은 파일로 쓰고 있는데, 그 대신에 파일 호출 주위에 뮤텍스를 사용하거나 다중 처리 스레드 안전 컨테이너를 사용하여 결과를 저장합니다 모든 것이 끝나면 주 스레드에서 파일까지

+0

)) #ips = (range_85 + ").범위 (0255)) IPS = [] 의 I 내지 I는 "+ STR (I) (1255) ips.append (range_85 + + STR (I '.')) 같은 범위를 생성 p.map (핑, IPS) – ramzal

+0

@ramzal는 달리, 형식 학습하십시오이 (2) 페이지로 지금, 그것은이 멀티 코드로 이동하지만,하지만, 기능이 작동하지에 multiprocessing.Pool와 전화 당신이 물어하려고하는 것을 이해하는 것은 불가능합니다. – chrisz

+0

난 아직 out..sadly 운을 파악하지하려고 이잖아. – ramzal