环境使用python3.6.2版本,linux使用centos7
这个程序主要使用paramiko模块实现。我们实现相关信息的获取,具体的监控系统和手段由于大家实现方式不一,就不举例了。
1、内存信息的读取。
通过远程执行‘cat /proc/meminfo’可以获取内存相关信息。这里我只读取MemTotal和MemFree的信息。需要读取其他信息可以利用正则表达式匹配获取其他数据。例子把这两个信息输出到标准输出中,实际应用可以通过crontab定时执行脚本,把结果写入文件,可以给传给监控系统,当超越一定阀值的时候进行相应的处理
import paramiko
import re
#设置主机列表
host_list=({'ip':'192.168.98.130', 'port':22, 'username':'root', 'password':'123'},
{'ip':'192.168.98.131', 'port':22, 'username':'root', 'password':'123'},)
ssh = paramiko.SSHClient()
# 设置为接受不在known_hosts 列表的主机可以进行ssh连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
for host in host_list:
ssh.connect(hostname=host['ip'], port=host['port'], username=host['username'], password=host['password'])
print(host['ip'])
stdin, stdout, stderr = ssh.exec_command('cat /proc/meminfo')
str_out = stdout.read().decode()
str_err = stderr.read().decode()
if str_err != "":
print(str_err)
continue
str_total = re.search('MemTotal:.*?\n', str_out).group()
print(str_total)
totalmem = re.search('\d+',str_total).group()
str_free = re.search('MemFree:.*?\n', str_out).group()
print(str_free)
freemem = re.search('\d+',str_free).group()
use = round(float(freemem)/float(totalmem), 2)
print('当前内存使用率为:'+ str(use))
ssh.close()
2、CPU使用率的读取
这里使用cat /proc/stat命令读取实时的CPU使用率。这个命令可以获取到cpu的各种时间。具体的分析请自行百度。由于这个时间数值是从开机之后一直累加的,因此我们要取一次值之后,隔一小段时间再取一次值,前后两次的值相减,再计算这段时间的CPU利用率。具体公式是:
CPU利用率= 1-(CPU空闲时间2 - CPU空闲时间1) / (CPU总时间2 - CPU总时间1)
其中"CPU空闲时间1"为第一次取值时第4项的值,"CPU空闲时间2"为第二次取值时第4项的值,"CPU总时间1"为第一次取值时各项数值的总和,"CPU总时间2"为第二次取值时各项数值的总和
import paramiko
import re
import time
import sys
#设置主机列表
host_list=({'ip':'192.168.98.130', 'port':22, 'username':'root', 'password':'123'},
{'ip':'192.168.98.131', 'port':22, 'username':'root', 'password':'123'},)
ssh = paramiko.SSHClient()
# 设置为接受不在known_hosts 列表的主机可以进行ssh连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
for host in host_list:
ssh.connect(hostname=host['ip'], port=host['port'], username=host['username'], password=host['password'])
print(host['ip'])
stdin, stdout, stderr = ssh.exec_command('cat /proc/stat | grep "cpu "')
str_out = stdout.read().decode()
str_err = stderr.read().decode()
if str_err != "":
print(str_err)
continue
else:
cpu_time_list = re.findall('\d+', str_out)
cpu_idle1 = cpu_time_list[3]
total_cpu_time1 = 0
for t in cpu_time_list:
total_cpu_time1 = total_cpu_time1 + int(t)
time.sleep(2)
stdin, stdout, stderr = ssh.exec_command('cat /proc/stat | grep "cpu "')
str_out = stdout.read().decode()
str_err = stderr.read().decode()
if str_err != "":
print(str_err)
continue
else:
cpu_time_list = re.findall('\d+', str_out)
cpu_idle2 = cpu_time_list[3]
total_cpu_time2 = 0
for t in cpu_time_list:
total_cpu_time2 = total_cpu_time2 + int(t)
cpu_usage = round(1 - (float(cpu_idle2) - float(cpu_idle1)) / (total_cpu_time2 - total_cpu_time1), 2)
print('当前CPU使用率为:' + str(cpu_usage))
ssh.close()
3、磁盘使用率
这里使用df命令获取磁盘使用情况。这个命令相当方便,既获取了磁盘的容量,也获取了使用率,可以根据需要进行后续的处理
import paramiko
import re
#设置主机列表
host_list=({'ip':'192.168.98.130', 'port':22, 'username':'root', 'password':'123'},
{'ip':'192.168.98.131', 'port':22, 'username':'root', 'password':'123'},)
ssh = paramiko.SSHClient()
# 设置为接受不在known_hosts 列表的主机可以进行ssh连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
for host in host_list:
ssh.connect(hostname=host['ip'], port=host['port'], username=host['username'], password=host['password'])
print(host['ip'])
stdin, stdout, stderr = ssh.exec_command('df -lm')
str_out = stdout.read().decode()
str_err = stderr.read().decode()
if str_err != "":
print(str_err)
continue
print(str_out)
ssh.close()
4、网络流量
网络流量可以使用cat /proc/net/dev查看,可以看到每个网络接口当前发送和接收的字节和包的数量,由于是一个累计的值,如果需要计算一定时间间隔内的流量,可以让程序sleep一定时间,然后再次获取,进行计算。个人建议每隔一段时间获取这个值,并且写入文件中,然后再使用其他程序去计算其速度和流量
import paramiko
import re
#设置主机列表
host_list=({'ip':'192.168.98.130', 'port':22, 'username':'root', 'password':'123'},
{'ip':'192.168.98.131', 'port':22, 'username':'root', 'password':'123'},)
ssh = paramiko.SSHClient()
# 设置为接受不在known_hosts 列表的主机可以进行ssh连接
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
for host in host_list:
ssh.connect(hostname=host['ip'], port=host['port'], username=host['username'], password=host['password'])
print(host['ip'])
stdin, stdout, stderr = ssh.exec_command('cat /proc/net/dev')
str_out = stdout.read().decode()
str_err = stderr.read().decode()
if str_err != "":
print(str_err)
continue
print(str_out)
ssh.close()