1. 程式人生 > >Python批量監控主機記憶體/CPU利用率/磁碟/網路等資訊

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()