我写了一个ruby脚本来并行ping多个主机并打印[host:result]对。这是我到目前为止制作的剧本:
require 'thread'
out = ""
queue = Queue.new
hosts = ["www.google.com", "www.onet.pl", "www.lego.com", "www.example.com"]
hosts.each do |x|
queue << x;
end
hash = Hash.new "NO REPLY"
threads = []
NO_OF_THREADS = 4;
for i in 1..NO_OF_THREADS
threads << Thread.new do
until queue.empty? do
host = queue.pop(true) rescue nil
if host
out = `ping #{host} -c 10 | grep 'packet loss'`
hash[host] = out
end
end # until
end # thread
end # for
threads.each do |t|
t.join
end
puts hash
当我将线程数设置为1
时,我得到0% packets lost
个响应,但是当我尝试一次执行多个线程时,我收到了大量丢失的数据包。我用一长串主机执行这个脚本来检查和许多线程;结果是我列表中的大多数主机都丢失了100%的数据包。
我尝试与Mutex
同步,而不是使用Queue
并在帖子中添加sleep
,但我没有帮助。此时我不确定我的代码是否存在问题,或者我误解了ping应该如何工作。为什么我丢失了很多数据包?有办法解决吗?
答案 0 :(得分:0)
首先想到的是,并非所有这些主机都必须允许ICMP PING消息。
但是,我运行您的代码,并在主机上获得0%的数据包丢失:
www.google.com10 packets transmitted, 10 packets received, 0.0% packet loss
www.lego.com10 packets transmitted, 10 packets received, 0.0% packet loss
www.onet.pl10 packets transmitted, 10 packets received, 0.0% packet loss
www.example.com10 packets transmitted, 10 packets received, 0.0% packet loss
您在运行代码的是什么?一台虚拟机?可能存在一些潜在的操作系统问题,表现为丢失数据包。