Python批量監控主機記憶體/CPU利用率/磁碟/網路等資訊
環境使用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()