一、背景
因需要对系统20多个tcp端口进行检测,如果通过shell脚本实现太费时了,检测效果也不佳,这里用python的多线程实现端口检测。
二、多线程模块介绍
多线程是共享内存资源的,所以对于数据的同步很重要,我这里将原始数据声明成列表,然后通过pop弹出列表元素,这样只要列表不为空则继续弹出,列表为空则跳出。这里使用Threading模块创建线程。
import threading
threads = []
for i in range(1,10):
thr = threading.Thread(target=is_reacheable,args=(host_server,logger1,logger2))
thr.start()
threads.append(thr)
for thr in threads:
thr.join()
备注:先定义一个线程池,我用的是列表模块,python也自带了Queue模块,这里是同时开启10个线程共同处理一个内存资源对象。thr.join()表示线程处理完
三、模块 subprocess 使用方法
subprocess模块能阻止输出,当你不关心输出结果时用这个模块挺好的。
通过 subprocess.call 方法的返回值能够判定命令是否执行成功(执行成功则返回0)。
import subprocess
四、模块 logging 使用方法
通过模块 logging 定义日志等级,比较方便记录日志。
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=res_log,
filemode='a+')
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')
备注:我对这个模块用法也不是很熟悉,基本也是套用官方的
五、源码介绍
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# yousong.xiang
# 2020.5.27
# v1.0.1
# 端口检查脚本,需要安装nc组件 yum install -y nc 这里使用的环境为python2.7
import subprocess
import threading
import os
import logging
port_alive = []
port_unreacheable = []
port_list=[ 9761,
9762,
9763,
9781,
9766,
9767,
9768,
9769,
9770,
9771,
8001,
8032,
8031,
8061,
8062,
8063,
8073,
8852,
8850,
8851,
8853,
8860,
]
def is_reacheable(host_server,logger1,logger2):
try:
while port_list:
port = port_list.pop()
if not subprocess.call("nc -v -w 4 {} -z {}".format(host_server, port), shell=True):
port_alive.append(port)
logger1.info('端口:{} 正常'.format(port))
else:
port_unreacheable.append(port)
logger2.error('端口:{} 异常'.format(port))
except Exception as f:
pass
def main():
ab_path = os.path.abspath('./')
res_log = os.path.join(ab_path, 'xone_status.log')
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%Y-%m-%d %H:%M:%S',
filename=res_log,
filemode='a+')
logger1 = logging.getLogger('myapp.area1')
logger2 = logging.getLogger('myapp.area2')
threads = []
host_server = 'localhost'
for i in range(1,10):
thr = threading.Thread(target=is_reacheable,args=(host_server,logger1,logger2))
thr.start()
threads.append(thr)
for thr in threads:
thr.join()
if port_unreacheable:
# print('存在异常端口')
exit(4)
if __name__ == '__main__':
main()
六、检查日志信息
[root@xone-test-tmp-01 ~]# tailf /var/log/keepalived-xone-check.log
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9781 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9770 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9767 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9999 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9766 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9768 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9763 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9771 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9762 正常
2020-07-14 09:49:56 xone_check.py[line:48] INFO 端口:9761 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8852 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8062 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8860 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8851 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8031 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8061 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8850 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8853 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8032 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8001 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9770 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:8073 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9769 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9771 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9768 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9999 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9766 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9763 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9762 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9781 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9767 正常
2020-07-14 09:50:04 xone_check.py[line:48] INFO 端口:9761 正常
备注:基本都是1~2秒20多个端口全部检测完成,比shell脚本有效率一些
留言