这是代码。 计划是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()
答案 0 :(得分:0)
此代码不完整,因此很难确定, 但似乎您正在尝试创建一个要在此行中扫描的ips列表:
ips = range_85 +"."+ str('%d' % i for i in range(1,254))
问题在于str()转换,您将生成器对象转换为字符串,而不是实际生成生成器的每个元素的字符串
为您的ip范围创建一个生成器,您可以用以下内容替换该行:
ips = ( range_85 + "." + str(i) for i in range(1,254))
我应该注意你从ip范围中排除0和254,它们在你的ip范围内仍然有效(即使你不想ping 10.85.40.255)范围(0,255)会给你整个ip范围(排除255)
修改强>
鉴于问题完全改变,这里是新问题的答案:
你的ping调用永远不会返回,至少在Linux上“ping xx.xx.xx.xx”将无限期地发送icmp数据包,直到它被SIGINT停止
你可以在这里参考ping文档:https://linux.die.net/man/8/ping
尝试更改行
rep = subprocess.call("ping 1 %s" % host, shell=False)
到
rep = subprocess.call("ping -c 1 %s" % host, shell=False)
请注意,如果您想确保随机数据包丢弃不会影响结果,您可以而且应该发送多个数据包。
你似乎只使用2个线程的线程池,除非你的资源令人难以置信地饿了,你可以使用更多的东西(如果你使用普通的PC,可能会有数百个),因为ping命令不需要大量的CPU电源,它只是挂起等待答案。
最后一个注意事项:你是从多个位置写到同一个文件,我建议不要这样做,而是在文件调用周围使用互斥锁,或者使用多处理线程安全容器保存结果然后从中写入一切都完成后,文件的主线程