Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Python script for do multi-threaded ping
#!/usr/bin/env python
# ping a list of host with threads for increase speed
# use standard linux /bin/ping utility
from threading import Thread
import subprocess
try:
import queue
except ImportError:
import Queue as queue
import re
# some global vars
num_threads = 15
ips_q = queue.Queue()
out_q = queue.Queue()
# build IP array
ips = []
for i in range(1,200):
ips.append("192.168.0."+str(i))
# thread code : wraps system ping command
def thread_pinger(i, q):
"""Pings hosts in queue"""
while True:
# get an IP item form queue
ip = q.get()
# ping it
args=['/bin/ping', '-c', '1', '-W', '1', str(ip)]
p_ping = subprocess.Popen(args,
shell=False,
stdout=subprocess.PIPE)
# save ping stdout
p_ping_out = str(p_ping.communicate()[0])
if (p_ping.wait() == 0):
# rtt min/avg/max/mdev = 22.293/22.293/22.293/0.000 ms
search = re.search(r'rtt min/avg/max/mdev = (.*)/(.*)/(.*)/(.*) ms',
p_ping_out, re.M|re.I)
ping_rtt = search.group(2)
out_q.put("OK " + str(ip) + " rtt= "+ ping_rtt)
# update queue : this ip is processed
q.task_done()
# start the thread pool
for i in range(num_threads):
worker = Thread(target=thread_pinger, args=(i, ips_q))
worker.setDaemon(True)
worker.start()
# fill queue
for ip in ips:
ips_q.put(ip)
# wait until worker threads are done to exit
ips_q.join()
# print result
while True:
try:
msg = out_q.get_nowait()
except queue.Empty:
break
print(msg)
#!/usr/bin/env python
# ping a list of host with threads for increase speed
# design to use data from/to SQL database
# use standard linux /bin/ping utility
from threading import Thread
import mysql.connector
import subprocess
try:
import queue
except ImportError:
import Queue as queue
import time
import re
# some global vars
num_threads = 30
ips_q = queue.Queue()
out_q = queue.Queue()
# thread code : wraps system ping command
def thread_pinger(i, q):
"""Pings hosts in queue"""
while True:
# get an IP item form queue
item = q.get()
# ping it
args=['/bin/ping', '-c', '1', '-W', str(item['timeout']),
str(item['ip'])]
p_ping = subprocess.Popen(args,
shell=False,
stdout=subprocess.PIPE)
# save ping stdout
p_ping_out = str(p_ping.communicate()[0])
# ping return 0 if up
if (p_ping.wait() == 0):
# rtt min/avg/max/mdev = 22.293/22.293/22.293/0.000 ms
search = re.search(r'rtt min/avg/max/mdev = (.*)/(.*)/(.*)/(.*) ms',
p_ping_out, re.M|re.I)
item['up'] = True
item['rtt'] = search.group(2)
else:
item['up'] = False
# update output queue
out_q.put(item)
# update queue : this ip is processed
q.task_done()
# start the thread pool
for i in range(num_threads):
worker = Thread(target=thread_pinger, args=(i, ips_q))
worker.setDaemon(True)
worker.start()
# build IP array
ips = []
for i in range(1,200):
ips.append("192.168.0."+str(i))
# main loop
while True:
# retreive data from DB
# add SQL here
# test start time
start = time.time()
# fill queue
for ip in ips:
ips_q.put({'ip': ip, 'timeout': 1})
# wait until worker threads are done to exit
ips_q.join()
# display result
print("next:")
while True:
try:
msg = out_q.get_nowait()
except queue.Empty:
break
if msg['up']:
print(msg)
# test start end
end = time.time()
loop_time = round(end - start, 2)
print("loop time: %s" % (loop_time))
# update DB
#add SQL here
# wait 5s before next cycle
time.sleep(5.0)
@huangjunque
Copy link

huangjunque commented Oct 20, 2016

nice

@s0ren
Copy link

s0ren commented Aug 21, 2019

Any idea where to find Queue package?

@sourceperl
Copy link
Author

sourceperl commented Aug 21, 2019

Queue is in the Python standard library. In Python 3, module name is now "queue" instead of "Queue" in Python 2.

"th_pinger.py" is an older script which initially run only on Python 2. I've juste update this gist to be able to run on both python 2 and 3.

@prestigio391
Copy link

prestigio391 commented Dec 8, 2021

Hello, I want save output into .txt file but it is still empty .Do zou have any idea how to do it ? Pinged.txt file is still empty

 # save ping stdout
p_ping_out = str(p_ping.communicate()[0])

f = open("/home/pavollorenc/CODE/PYTHON/subnet_ping/pinged.txt", "a")
f.write(str(ip) + '\t' + 'UP' + '\n')
f.close

if (p_ping.wait() == 0):
  # rtt min/avg/max/mdev = 22.293/22.293/22.293/0.000 ms
  search = re.search(r'rtt min/avg/max/mdev = (.*)/(.*)/(.*)/(.*) ms',
                     p_ping_out, re.M|re.I)
  ping_rtt = search.group(2)
  out_q.put("OK " + str(ip) + " rtt= "+ ping_rtt)
# update queue : this ip is processed 
q.task_done()

@themegabyte
Copy link

themegabyte commented Mar 22, 2022

will this work on windows?

@sourceperl
Copy link
Author

sourceperl commented Mar 23, 2022

no, it will not work on windows

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment