溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python windows下如何通過SSH獲取linux系統(tǒng)cpu、內(nèi)存、網(wǎng)絡(luò)使用情況

發(fā)布時間:2021-12-02 17:31:18 來源:億速云 閱讀:573 作者:柒染 欄目:云計算

今天就跟大家聊聊有關(guān)python windows下如何通過SSH獲取linux系統(tǒng)cpu、內(nèi)存、網(wǎng)絡(luò)使用情況,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

做個程序,需要用到系統(tǒng)的cpu、內(nèi)存、網(wǎng)絡(luò)的使用情況。于是乎就自己寫一個。

一、計算cpu的利用率

要讀取cpu的使用情況,首先要了解/proc/stat文件的內(nèi)容,下圖是/proc/stat文件的一個例子:

python windows下如何通過SSH獲取linux系統(tǒng)cpu、內(nèi)存、網(wǎng)絡(luò)使用情況

cpu、cpu0、cpu1……每行數(shù)字的意思相同,從左到右分別表示user、nice、system、idle、iowait、irq、softirq。根據(jù)系統(tǒng)的不同,輸出的列數(shù)也會不同,比如ubuntu 12.04會輸出10列數(shù)據(jù),centos 6.4會輸出9列數(shù)據(jù),后邊幾列的含義不太清楚,每個系統(tǒng)都是輸出至少7列。沒一列的具體含義如下:

user:用戶態(tài)的cpu時間(不包含nice值為負的進程所占用的cpu時間)

nice:nice值為負的進程所占用的cpu時間

system:內(nèi)核態(tài)所占用的cpu時間

idle:cpu空閑時間

iowait:等待IO的時間

irq:系統(tǒng)中的硬中斷時間

softirq:系統(tǒng)中的軟中斷時間

以上各值的單位都是jiffies,jiffies是內(nèi)核中的一個全局變量,用來記錄自系統(tǒng)啟動一來產(chǎn)生的節(jié)拍數(shù),在這里把它當(dāng)做單位時間就行。

intr行中包含的是自系統(tǒng)啟動以來的終端信息,第一列表示中斷的總此數(shù),其后每個數(shù)對應(yīng)某一類型的中斷所發(fā)生的次數(shù)

ctxt行中包含了cpu切換上下文的次數(shù)

btime行中包含了系統(tǒng)運行的時間,以秒為單位

processes/total_forks行中包含了從系統(tǒng)啟動開始所建立的任務(wù)個數(shù)

procs_running行中包含了目前正在運行的任務(wù)的個數(shù)

procs_blocked行中包含了目前被阻塞的任務(wù)的個數(shù)

由于計算cpu的利用率用不到太多的值,所以截圖中并未包含/proc/stat文件的所有內(nèi)容。

知道了/proc文件的內(nèi)容之后就可以計算cpu的利用率了,具體方法是:先在t1時刻讀取文件內(nèi)容,獲得此時cpu的運行情況,然后等待一段時間在t2時刻再次讀取文件內(nèi)容,獲取cpu的運行情況,然后根據(jù)兩個時刻的數(shù)據(jù)通過以下方式計算cpu的利用率:100 - (idle2 - idle1)*100/(total2 - total1),其中total = user + system + nice + idle + iowait + irq + softirq。python代碼實現(xiàn)如下:

#-*- encoding: utf-8 -*-
import paramiko
import time

def getSSHOutput(host,userName,password,port):
    sshClient = paramiko.SSHClient()
    sshClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    sshClient.connect(host,port,userName,password)
    command = r"cat /proc/stat"
    stdin,stdout,stderr = sshClient.exec_command(command)
    outs = stdout.readlines()
    sshClient.close()
    return outs

def getCpuInfo(outs):  
    for line in outs:
        line = line.lstrip()  
        counters = line.split()
        if len(counters) < 5:
            continue
        if counters[0].startswith('cpu'):
            break
    total = 0
    for i in range(1, len(counters)):
        total = total + long(counters[i])
    idle = long(counters[4])
    return {'total':total, 'idle':idle}
           
def calcCpuUsage(counters1, counters2):
    idle = counters2['idle'] - counters1['idle']
    total = counters2['total'] - counters1['total']
    return 100 - (idle*100/total)
           
if __name__ == '__main__':
    while True:
        SSHOutput = getSSHOutput("192.168.144.128","root","******",22)
        counters1 = getCpuInfo(SSHOutput)  
        time.sleep(1)
        SSHOutput = getSSHOutput("192.168.144.128","root","******",22)
        counters2 = getCpuInfo(SSHOutput)    
        print (calcCpuUsage(counters1, counters2))

二、計算內(nèi)存的利用率

計算內(nèi)存的利用率需要讀取的是/proc/meminfo文件,該文件的結(jié)構(gòu)比較清晰。

python windows下如何通過SSH獲取linux系統(tǒng)cpu、內(nèi)存、網(wǎng)絡(luò)使用情況

需要知道的是內(nèi)存的使用總量為used = total - free - buffers - cached,python代碼實現(xiàn)如下:

#-*- encoding: utf-8 -*-
import paramiko
import time

def getSSHOutput(host,userName,password,port):
    sshClient = paramiko.SSHClient()
    sshClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    sshClient.connect(host,port,userName,password)
    command = r"cat /proc/meminfo"
    stdin,stdout,stderr = sshClient.exec_command(command)
    outs = stdout.readlines()
    sshClient.close()
    return outs
    
def getMemInfo(outs):
    res = {'total':0, 'free':0, 'buffers':0, 'cached':0}
    index = 0
    for line in outs:
        if(index == 4):
            break
        line = line.lstrip()         
        memItem = line.lower().split()
        if memItem[0] == 'memtotal:':         
            res['total'] = long(memItem[1])
            index = index + 1
            continue
        elif memItem[0] == 'memfree:':
            res['memfree'] = long(memItem[1])
            index = index + 1
            continue
        elif memItem[0] == 'buffers:':
            res['buffers'] = long(memItem[1])
            index = index + 1
            continue
        elif memItem[0] == 'cached:':
            res['cached'] = long(memItem[1])
            index = index + 1
            continue
    return res
           
def calcMemUsage(counters):
    used = counters['total'] - counters['free'] - counters['buffers'] - counters['cached']
    total = counters['total']
    return used*100/total
               
if __name__ == '__main__':
    while True:
        SSHOutput = getSSHOutput("192.168.144.128","root","******",22)
        counters = getMemInfo(SSHOutput)  
        time.sleep(1)
        print (calcMemUsage(counters))

三、獲取網(wǎng)絡(luò)的使用情況

獲取網(wǎng)絡(luò)使用情況需要讀取的是/proc/net/dev文件,如下圖所示,里邊的內(nèi)容也很清晰,不做過多的介紹,直接上python代碼,取的是eth0的發(fā)送和收取的總字節(jié)數(shù):

python windows下如何通過SSH獲取linux系統(tǒng)cpu、內(nèi)存、網(wǎng)絡(luò)使用情況

#-*- encoding: utf-8 -*-
import paramiko
import time

def getSSHOutput(host,userName,password,port):  
    sshClient = paramiko.SSHClient()
    sshClient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    sshClient.connect(host,port,userName,password)
    command = r"cat /proc/net/dev"
    stdin,stdout,stderr = sshClient.exec_command(command)
    outs = stdout.readlines()
    sshClient.close()
    return outs

def getNetInfo(dev,outs):
    res = {'total':0, 'in':0, 'out':0}
    for line in outs:
        if line.lstrip().startswith(dev):
            line = line.replace(':', ' ')
            items = line.split()
            res['in'] = long(items[1])
            res['out'] = long(items[len(items)/2 + 1])
            res['total'] = res['in'] + res['out']
    return res
if __name__ == '__main__':
    SSHOutput = getSSHOutput("192.168.144.128","root","******",22)
    print getNetInfo('eth0',SSHOutput)

看完上述內(nèi)容,你們對python windows下如何通過SSH獲取linux系統(tǒng)cpu、內(nèi)存、網(wǎng)絡(luò)使用情況有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI