1、背景
当前项目在网线插拔时 需要重启一些服务。因此通过ethtool eth0命令来获取网口的状态。
#!/usr/bin/env python3
# coding=utf-8
# create at 2019-11-06
import subprocess
import threading
class MonitorNetwork:
'用于网络状态监听 发送给主模块 用于服务重启'
'''
传入要监听的端口号
'''
name = [0];
def callBack(self, change):
print("我是回调函数!")
'''
保存状态 用于缓存要监听的每个端口的状态
'''
status = [];
'''
初始化函数 接收要监听的端口号 以数组形式传入 [0, 1, 2, 3...]等等
'''
def __init__(self, name, callBack):
self.name = name;
self.callBack = callBack;
# 调用监听函数
self.MonitorNetworkStatus();
"""
根据接口名称获取接口信息
"""
def getEthtool(self):
# val = os.system('ethtool eth' + str(name) + '| grep Link');
list = [];
for _name in self.name:
p = subprocess.Popen(["ethtool eth" + str(_name) + " | grep Link | awk {'print $3'}"], shell=True,
stdout=subprocess.PIPE).communicate()
# 二维数组 0位保存的是监控的端口号 1位是状态
list.append([_name, bool(p[0])]);
return list;
"""
监听端口线程启动
timer 用于对外暴露线程终止
"""
timer = None;
def MonitorNetworkStatus(self):
statusArr = self.getEthtool();
change = [];
print(statusArr)
for i in range(0, len(statusArr)):
_status = statusArr[i];
if bool(len(_status)) & len(self.status) == len(_status):
if (_status[1] != self.status[i][1]):
change.append(_status);
self.status[i][1] = _status[1];
else:
self.status.append(_status);
if bool(len(change)):
# 将change发送出去
self.callBack(change);
print('发送消息');
self.timer = threading.Timer(6000, self.MonitorNetworkStatus);
self.timer.start()
'''
线程终止 停止监控
'''
def stopMonitor(self):
self.timer.join()
# ntArr = [0, 1];
#
# def callBack(change):
# print("123");
#
# nt = MonitorNetwork(ntArr, callBack);