您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關python windows下如何通過SSH獲取linux系統cpu、內存、網絡使用情況,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
做個程序,需要用到系統的cpu、內存、網絡的使用情況。于是乎就自己寫一個。
要讀取cpu的使用情況,首先要了解/proc/stat文件的內容,下圖是/proc/stat文件的一個例子:
cpu、cpu0、cpu1……每行數字的意思相同,從左到右分別表示user、nice、system、idle、iowait、irq、softirq。根據系統的不同,輸出的列數也會不同,比如ubuntu 12.04會輸出10列數據,centos 6.4會輸出9列數據,后邊幾列的含義不太清楚,每個系統都是輸出至少7列。沒一列的具體含義如下:
user:用戶態的cpu時間(不包含nice值為負的進程所占用的cpu時間)
nice:nice值為負的進程所占用的cpu時間
system:內核態所占用的cpu時間
idle:cpu空閑時間
iowait:等待IO的時間
irq:系統中的硬中斷時間
softirq:系統中的軟中斷時間
以上各值的單位都是jiffies,jiffies是內核中的一個全局變量,用來記錄自系統啟動一來產生的節拍數,在這里把它當做單位時間就行。
intr行中包含的是自系統啟動以來的終端信息,第一列表示中斷的總此數,其后每個數對應某一類型的中斷所發生的次數
ctxt行中包含了cpu切換上下文的次數
btime行中包含了系統運行的時間,以秒為單位
processes/total_forks行中包含了從系統啟動開始所建立的任務個數
procs_running行中包含了目前正在運行的任務的個數
procs_blocked行中包含了目前被阻塞的任務的個數
由于計算cpu的利用率用不到太多的值,所以截圖中并未包含/proc/stat文件的所有內容。
知道了/proc文件的內容之后就可以計算cpu的利用率了,具體方法是:先在t1時刻讀取文件內容,獲得此時cpu的運行情況,然后等待一段時間在t2時刻再次讀取文件內容,獲取cpu的運行情況,然后根據兩個時刻的數據通過以下方式計算cpu的利用率:100 - (idle2 - idle1)*100/(total2 - total1),其中total = user + system + nice + idle + iowait + irq + softirq。python代碼實現如下:
#-*- 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))
計算內存的利用率需要讀取的是/proc/meminfo文件,該文件的結構比較清晰。
需要知道的是內存的使用總量為used = total - free - buffers - cached,python代碼實現如下:
#-*- 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))
三、獲取網絡的使用情況
獲取網絡使用情況需要讀取的是/proc/net/dev文件,如下圖所示,里邊的內容也很清晰,不做過多的介紹,直接上python代碼,取的是eth0的發送和收取的總字節數:
#-*- 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)
看完上述內容,你們對python windows下如何通過SSH獲取linux系統cpu、內存、網絡使用情況有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。