首页 > 编程 > Python > 正文

python 多线程实现检测服务器在线情况

2020-01-04 17:55:32
字体:
来源:转载
供稿:网友

本文给大家分享的是Python使用多线程通过ping命令检测服务器的在线状况,给大家了内网和外网的2个例子,有需要的小伙伴可以参考下。

需要ping一个网段所有机器的在线情况,shell脚步运行时间太长,用python写个多线程ping吧,代码如下:

 

  1. #!/usr/bin/python 
  2. #coding=utf-8 
  3. ''
  4. Created on 2015-8-4 
  5. @author: Administrator 
  6. ''
  7.  
  8. import threading,subprocess 
  9. from time import ctime,sleep,time 
  10. import Queue 
  11.  
  12. queue=Queue.Queue() 
  13.  
  14. class ThreadUrl(threading.Thread): 
  15. def __init__(self,queue): 
  16. threading.Thread.__init__(self) 
  17. self.queue=queue 
  18.  
  19. def run(self): 
  20. while True: 
  21. host=self.queue.get() 
  22. ret=subprocess.call('ping -c 1 -w 1 '+host,shell=True,stdout=open('/dev/null','w')) 
  23. if ret: 
  24. print "%s is down" % host 
  25. else
  26. print "%s is up" % host 
  27. self.queue.task_done() 
  28.  
  29. def main(): 
  30. for i in range(100): 
  31. t=ThreadUrl(queue) 
  32. t.setDaemon(True) 
  33. t.start() 
  34. for host in b: 
  35. queue.put(host) 
  36. queue.join() 
  37.  
  38. a=[] 
  39. with open('ip.txt') as f: 
  40. for line in f.readlines(): 
  41. a.append(line.split()[0]) 
  42. #print a 
  43.  
  44. b=['192.168.3.'+str(x) for x in range(1,254)] #ping 192.168.3 网段 
  45. start=time() 
  46. main() 
  47. print "Elasped Time:%s" % (time()-start) 
  48.  
  49. #t2=threading.Thread(target=move,args=('fff',)) 
  50. #threads.append(t2) 
  51.  
  52. ''
  53. for i in a: 
  54. print ctime() 
  55. ping(i) 
  56. sleep(1) 
  57.  
  58. if __name__ == '__main__'
  59. for t in range(len(a)): 
  60. #t.setDaemon(True) 
  61. threads[t].start() 
  62. #t.join() 
  63. print "All over %s" % ctime() 
  64. ''

效果如下:

python 多线程实现检测服务器在线情况

平一个网段只要2.7s左右,够快!!!

再给大家分享一个检测外网服务器的方法及代码

经常使用python检测服务器是否能ping通, 程序是否正常运行(检测对应的端口是否正常)

以前使用shell脚本的写法如下:

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

或者

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

代码示例:

 

 
  1. #!/usr/bin/python 
  2. # encoding=utf-8 
  3. # Filename: net_is_normal.py 
  4. import os 
  5. import socket 
  6. import subprocess 
  7.  
  8.  
  9. #判断网络是否正常 
  10. server='www.baidu.com' 
  11. #检测服务器是否能ping通,在程序运行时,会在标准输出中显示命令的运行信息 
  12. def pingServer(server): 
  13. result=os.system('ping '+server+' -c 2'
  14. if result: 
  15. print '服务器%s ping fail' % server 
  16. else
  17. print '服务器%s ping ok' % server 
  18. print result 
  19.  
  20. #把程序输出定位到/dev/null,否则会在程序运行时会在标准输出中显示命令的运行信息  
  21. def pingServerCall(server): 
  22. fnull = open(os.devnull, 'w'
  23. result = subprocess.call('ping '+server+' -c 2', shell = True, stdout = fnull, stderr = fnull) 
  24. if result: 
  25. print '服务器%s ping fail' % server 
  26. else
  27. print '服务器%s ping ok' % server 
  28. fnull.close() 
  29.  
  30. #可用于检测程序是否正常,如检测redis是否正常,即检测redis的6379端口是否正常 
  31. #检测ssh是否正常,即检测ssh的22端口是否正常 
  32. def check_aliveness(ip, port): 
  33. sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
  34. sk.settimeout(1) 
  35. try
  36. sk.connect((ip,port)) 
  37. print 'server %s %d service is OK!' %(ip,port) 
  38. return True 
  39. except Exception: 
  40. print 'server %s %d service is NOT OK!' %(ip,port) 
  41. return False 
  42. finally
  43. sk.close() 
  44. return False 
  45.  
  46. if __name__=='__main__'
  47. pingServerCall(server) 
  48. pingServer(server) 
  49. check_aliveness('192.168.230.128', 6379) 

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表