python写监控程序Pexpect模块(转载)
1、安装pexpect模块
pip install pexpect==4.6.0
2、创建py文件
touch monitor.py
文件内容如下:
#!/usr/bin/python3 # -*- coding:utf-8 -*- # __author__ = 'liao gao xiang' import re import time from datetime import datetime import pexpect class Monitor(object): """服务器自动化监控""" def __init__(self): self.host = "39.107.227.39" self.user = "root" self.password = "hj2018@dmg" def ssh_command(self, command): """SSH登录执行命令""" ssh = pexpect.spawn('ssh -l {} {} {}'.format(self.user, self.host, command)) # 登录口令 i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=30) if i == 0: ssh.sendline(self.password) if i == 1: ssh.sendline('yes') ssh.expect('[p,P]assword: ') ssh.sendline(self.password) index = ssh.expect(["$", "#", pexpect.EOF, pexpect.TIMEOUT]) # 此处注意,root用户登录符号为#,普通用户为$ if index != 0: print("登录失败!报错内容:{};{}".format(ssh.before.decode("utf-8"), ssh.after.decode("utf-8"))) return False return ssh def memory(self): """内存监控""" ssh = self.ssh_command("cat /proc/meminfo") ssh.expect(pexpect.EOF) data = re.findall(r"(\d+) kB", ssh.before.decode("utf-8")) # ssh.before结果为bytes类型,使用utf-8解码为string MemTotal = int(data[0]) // 1024 # 除以1024得到MB,整数 MemFree = int(data[1]) // 1024 Buffers = int(data[2]) // 1024 Cached = int(data[3]) // 1024 SwapCached = int(data[4]) // 1024 SwapTotal = int(data[13]) // 1024 SwapFree = int(data[14]) // 1024 print("*******************内存监控 {}******************".format(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))) print("总内存: {} MB".format(MemTotal)) print("空闲内存: {} MB".format(MemFree)) print("给文件的缓冲大小: {} MB".format(Buffers)) print("高速缓冲存储器使用的大小: {} MB".format(Cached)) print("被高速缓冲存储用的交换空间大小: {} MB".format(SwapCached)) print("给文件的缓冲大小: {} MB".format(Buffers)) if int(SwapTotal) == 0: print("交换内存总共为:0") else: print("交换内存利用率: {}%".format(round((SwapTotal - SwapFree) / float(SwapTotal) * 100, 2))) print("内存利用率: {}%".format(round((MemTotal - MemFree) / float(MemTotal) * 100, 2))) def vmstat(self): """内核线程、虚拟内存、磁盘和CPU活动的统计信息""" ssh = self.ssh_command("vmstat 1 2 | tail -n 1") ssh.expect(pexpect.EOF) vmstat_info = ssh.before.decode("utf-8").strip().split() processes_waiting = vmstat_info[0] processes_sleep = vmstat_info[1] swpd = int(vmstat_info[2]) // 1024 free = int(vmstat_info[3]) // 1024 buff = int(vmstat_info[4]) // 1024 cache = int(vmstat_info[5]) // 1024 si = int(vmstat_info[6]) // 1024 so = int(vmstat_info[7]) // 1024 io_bi = vmstat_info[8] io_bo = vmstat_info[9] system_interrupt = vmstat_info[10] system_context_switch = vmstat_info[11] cpu_user = vmstat_info[12] cpu_sys = vmstat_info[13] cpu_idle = vmstat_info[14] cpu_wait = vmstat_info[15] st = vmstat_info[16] print("*******************vmstat信息统计 {}******************".format(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))) print("等待运行进程的数量: {}".format(processes_waiting)) print("处于不间断状态的进程: {}".format(processes_sleep)) print("使用虚拟内存(swap)的总量: {} MB".format(swpd)) print("空闲的内存总量: {} MB".format(free)) print("用作缓冲的内存总量: {} MB".format(buff)) print("用作缓存的内存总量: {} MB".format(cache)) print("交换出内存总量 : {} MB".format(si)) print("交换入内存总量 : {} MB".format(so)) print("从一个块设备接收: {}".format(io_bi)) print("发送到块设备: {}".format(io_bo)) print("每秒的中断数: {}".format(system_interrupt)) print("每秒的上下文切换数: {}".format(system_context_switch)) print("用户空间上进程运行的时间百分比: {}".format(cpu_user)) print("内核空间上进程运行的时间百分比: {}".format(cpu_sys)) print("闲置时间百分比: {}".format(cpu_idle)) print("等待IO的时间百分比: {}".format(cpu_wait)) print("从虚拟机偷取的时间百分比: {}".format(st)) def cpu_info(self): """CPU信息获取""" ssh = self.ssh_command("cat /proc/cpuinfo") ssh.expect(pexpect.EOF) cpu_num = re.findall(r"processor.*?(\d+)", ssh.before.decode("utf-8"))[-1] print("*******************CPU信息 {}******************".format(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))) print("CPU数目: {}".format(str(int(cpu_num) + 1))) li = ssh.before.decode("utf-8").replace('\t', '').split('\r') CPUinfo, procinfo, nprocs = {}, {}, 0 for line in li: if line.find("processor") > -1: CPUinfo['CPU%s' % nprocs] = procinfo nprocs = nprocs + 1 else: if len(line.split(':')) == 2: procinfo[line.split(':')[0].strip()] = line.split(':')[1].strip() else: procinfo[line.split(':')[0].strip()] = '' for processor in CPUinfo.keys(): print("CPU属于的名字及其编号、标称主频: {}".format(CPUinfo[processor]['model name'])) print("CPU属于其系列中的哪一代的代号: {}".format(CPUinfo[processor]['model'])) print("CPU制造商: {}".format(CPUinfo[processor]['vendor_id'])) print("CPU产品系列代号: {}".format(CPUinfo[processor]['cpu family'])) print("CPU的实际使用主频: {} GHz".format(round(float(CPUinfo[processor]['cpu MHz']) / 1024, 2))) def load(self): """监控负载""" ssh = self.ssh_command("cat /proc/loadavg") ssh.expect(pexpect.EOF) loadavg = ssh.before.decode("utf-8").strip().split() print("*******************负载均衡监控 {}******************".format(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))) print("系统5分钟前的平均负载: {}".format(loadavg[0])) print("系统10分钟前的平均负载: {}".format(loadavg[1])) print("系统15分钟前的平均负载: {}".format(loadavg[2])) print("分子是正在运行的进程数,分母为总进程数: {}".format(loadavg[3])) print("最近运行的进程ID: {}".format(loadavg[4])) def ionetwork(self): """获取网络接口的输入和输出""" ssh = self.ssh_command("cat /proc/net/dev") ssh.expect(pexpect.EOF) li = ssh.before.decode("utf-8").strip().split('\n') print("*******************网络接口的输入和输出监控 {}******************".format(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))) net = {} for line in li[2:]: net_io = {} line = line.split(":") eth_name = line[0].strip() net_io['Receive'] = round(float(line[1].split()[0]) / (1024.0 * 1024.0), 2) # bytes / 1024 / 1024 得到MB net_io['Transmit'] = round(float(line[1].split()[8]) / (1024.0 * 1024.0), 2) net[eth_name] = net_io for k, v in net.items(): print("接口{}: 接收 {}MB 传输 {}MB".format(k, v.get("Receive"), v.get("Transmit"))) def disk(self): """磁盘空间监控""" ssh = self.ssh_command("df -h") ssh.expect(pexpect.EOF) data = ssh.before.decode("utf-8").strip().split('\n') disklists = [] for disk in data: disklists.append(disk.strip().split()) print("*******************磁盘空间 {}******************".format(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))) for i in disklists[1:]: print("\t文件系统: {}".format(i[0])) print("\t容量: {}".format(i[1])) print("\t已用: {}".format(i[2])) print("\t可用: {}".format(i[3])) print("\t已用%挂载点: {}".format(i[4])) def com(self): """端口监控""" ssh = self.ssh_command("netstat -tpln") ssh.expect(pexpect.EOF) print("*******************端口监控 {}******************".format(datetime.today().strftime("%Y-%m-%d %H:%M:%S"))) print(ssh.before.decode("utf-8")) if __name__ == '__main__': m = Monitor() while True: m.memory() m.vmstat() m.cpu_info() m.load() m.ionetwork() m.disk() m.com() time.sleep(60)
3、执行文件
python monitor.py
结果如下:
(本人python入门级,不解释代码)
0 Comments