近日因為施工單位進度太慢,導致工期超出預估。領導對此比較重視,讓我有空就要看一下完成的進度並匯報。我首先想到的是使用ping命令,但是手工ping了幾個,然後就干不下去了(太累了)。這個必須要自動化進行,而我選擇使用python來實現。
我寫了一個腳本:使用while循環,依次ping網絡中的每個節點,並將結果保存到文件中(代碼如下)。但是此方法耗時太久!
a=1 #定義a=1
while a<255: #當a<255時 循環執行
b='192.168.1.'+str(a) #b代表ip地址
ret = os.system('ping '+b+' -n 1 ') #每個ip只ping一次
if ret:
os.system('echo '+b+'>>d:\\res2.txt') #如果執行結果不為0, 將ip 放入文件res2.txt
else:
os.system('echo '+b+'>>d:\\res.txt') #否則放入res.txt
a=a+1
為了節約我雖然不能稱之為寶貴的時間,我將此段代碼進行了改造:
1、采用多線程,先是用了3個線程,最後使用了5個線程
2、不在將結果寫入文件,只在標准輸出上顯示
3、使用linux系統
#!/usr/bin/env python
#coding:utf-8
import os
import time
import threading #引入
class pings(threading.Thread): #定義線程主體部分
def __init__(self,num,interval):
threading.Thread.__init__(self)
self.nums=num #起始數
self.inter=interval #步長
self.thread_stop=False #線程是否停止
self.ns=0 #單線程計數
def run(self):
start=self.nums
while start<254 and not self.thread_stop:
ret=os.system('ping -c 1 -W 1 192.168.1.%d >/dev/null' % start)
if not ret:
print 'ping 192.168.1.%d ok' % start
self.ns +=1
start+=self.inter
print '線程%d結束, ' % self.nums ,
print '此線程共獲得 %d 個在線數據' % self.ns
def stop(self):
self.thread_stop=True
def pingt():
thread1=pings(1,5)
thread2=pings(2,5)
thread3=pings(3,5)
thread4=pings(4,5)
thread5=pings(5,5)
thread1.start()
thread2.start()
thread3.start()
thread4.start()
thread5.start()
time.sleep(55)
thread1.stop()
thread2.stop()
thread3.stop()
thread4.stop()
thread5.stop()
if __name__=='__main__':
pingt()
如下是我對公網上的地址段202.102.201.0/24 進行ping測試的結果,總共得到了29個在線的ip地址。