python 多線程實現檢測伺服器線上情況

來源:互聯網
上載者:User
需要ping一個網段所有機器的線上情況,shell腳步已耗用時間太長,用python寫個多線程ping吧,代碼如下:

#!/usr/bin/python#coding=utf-8'''Created on 2015-8-4@author: Administrator'''import threading,subprocessfrom time import ctime,sleep,timeimport Queuequeue=Queue.Queue()class ThreadUrl(threading.Thread):  def __init__(self,queue):    threading.Thread.__init__(self)    self.queue=queue  def run(self):    while True:      host=self.queue.get()      ret=subprocess.call('ping -c 1 -w 1 '+host,shell=True,stdout=open('/dev/null','w'))      if ret:        print "%s is down" % host      else:        print "%s is up" % host      self.queue.task_done()def main():  for i in range(100):    t=ThreadUrl(queue)    t.setDaemon(True)    t.start()  for host in b:    queue.put(host)  queue.join()a=[]with open('ip.txt') as f:  for line in f.readlines():    a.append(line.split()[0])  #print ab=['192.168.3.'+str(x) for x in range(1,254)] #ping 192.168.3 網段start=time()main()print "Elasped Time:%s" % (time()-start)#t2=threading.Thread(target=move,args=('fff',))#threads.append(t2)'''for i in a:  print ctime()  ping(i)  sleep(1)if __name__ == '__main__':  for t in range(len(a)):    #t.setDaemon(True)    threads[t].start()    #t.join()  print "All over %s" % ctime()'''

效果如下:

平一個網段只要2.7s左右,夠快!!!

再給大家分享一個檢測外網伺服器的方法及代碼

經常使用python檢測伺服器是否能ping通, 程式是否正常運行(檢測對應的連接埠是否正常)

以前使用shell指令碼的寫法如下:

PINGRET=$( ping www.baidu.com -c 2 | grep "icmp_" ); if [ -z $PINGRET ]; then echo "ping fail"; else echo "ping ok"; fi

或者

ping -c 2 www.baidu.com|grep "icmp_" && echo 'ping ok' || echo 'ping fail'

程式碼範例:

#!/usr/bin/python# encoding=utf-8# Filename: net_is_normal.pyimport osimport socketimport subprocess  #判斷網路是否正常server='www.baidu.com'#檢測伺服器是否能ping通,在程式運行時,會在標準輸出中顯示命令的運行資訊def pingServer(server):  result=os.system('ping '+server+' -c 2')  if result:    print '伺服器%s ping fail' % server  else:    print '伺服器%s ping ok' % server  print result #把程式輸出定位到/dev/null,否則會在程式運行時會在標準輸出中顯示命令的運行資訊 def pingServerCall(server):  fnull = open(os.devnull, 'w')  result = subprocess.call('ping '+server+' -c 2', shell = True, stdout = fnull, stderr = fnull)  if result:    print '伺服器%s ping fail' % server  else:    print '伺服器%s ping ok' % server  fnull.close()   #可用於檢測程式是否正常,如檢測redis是否正常,即檢測redis的6379連接埠是否正常#檢測ssh是否正常,即檢測ssh的22連接埠是否正常def check_aliveness(ip, port):  sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  sk.settimeout(1)  try:    sk.connect((ip,port))    print 'server %s %d service is OK!' %(ip,port)    return True  except Exception:    print 'server %s %d service is NOT OK!' %(ip,port)    return False  finally:    sk.close()  return False   if __name__=='__main__':  pingServerCall(server)  pingServer(server)  check_aliveness('192.168.230.128', 6379)
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.