一、背景

因需要对系统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脚本有效率一些
最后修改日期: 2020年7月14日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。