现在有一个运维场景是这样的,一共有三台机器,其中的1台类似是另外两台的数据中传站角色,由于业务比较特殊,要求实时能够监控这几台机器的网络连通性,如果发现有问题,就及时报警,基于以上背景,刚开始打算用shell 和telnet来实现,发现不太好用,因为要处理telnet成功后退出的问题,最后还是用了python写了一个简单的脚本实现了该功能,为方便多次使用,做成了可配置的,自带配置文件,只要配置好需要测试的机器的IP和端口,就很方便测试,功能代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#/usr/bin/env python #author:mindg.cn #date:2016-01-27 import socket def check(add, port): try: sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) sock.settimeout(5) sock.connect((add, port)) return True except socket.error, e: return False finally: sock.close() if __name__ == '__main__': import ConfigParser iplist = [] cf = ConfigParser.ConfigParser() cf.read('cfg.ini') s1 = cf.items('server1') s2 = cf.items('server2') add1, port1 = s1[0][1], s1[1][1] add2, port2 = s2[0][1], s2[1][1] iplist.append((add1, port1)) iplist.append((add2, port2)) while True: for ip, port in iplist: stat = check(ip, int(port)) if stat != True: print 'Found this %s server %s and port is inaccessible' % (ip, port) # time.sleep(10) break |
配置文件名称cfg.ini,格式为:
1 2 3 4 5 6 |
[server1] address = ip port = 80 [server2] address = ip port = 80 |
代码写的比较简单,只用了python的一个socket模块,核心几行解释下:
sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
这行是创建TCP/IP套接字,套接字分两种,一种是基于文件型的,一种是基于网络的,比如:socket.AF_INET,就是基于网络的,网络的通讯在开始前都需要创建套接字, 这就跟电话机线插口一样,没它没法打电话,socket本身的英语解释就有插座的意思,socket.SOCK_STREAM,表示采用是TCP套接字,其实可以这么理解,STREAM单词有流的感念,类似水流的感觉,大家可以想象,既然有水流的感觉,就是不能间断,所以就是建立的TCP套接字,我一直是这么理解的,重在理解,方法随意,另外不用猜,除了TCP,对应肯定有UDP套接字,
sock.settimeout(5) #设置超时时间
sock.connect((add, port)) #建立好套接字后,connect是套接字对象的内建方法,因为python是面向对象的语言,所以这也很好理解,每个对象都会带有很多方法或属性。
其它语句就不说了,链接成功就返回True,有任何错误就返回Flase,逻辑比较简单。
程序运行后是死循环,如果发现网络出现不可访问情况,将打印出一行错误日志,具体处理的方法当然有很多了,可以发邮件,也可以发短信报警,就不多说了。
Pingback引用通告: 消费kafka报java.nio.channels.ClosedChannelException – 源码巴士