擷取作業系統的當前運行狀態和負載情況,是一個系統管理員的基本技能,因為這對我們日常排查故障,定位問題有著非常緊密的聯絡,比如查看當前系統的基本資料,例如cpu,記憶體,網路接收包情況,磁碟的使用率等就是我們日常系統管理員經常要關注的內容,既然這些資訊如此重要,那能否每次登陸系統的時候自動給我們展示出來呢,其實解決這個問題很簡單,我們可以寫個指令碼,這個指令碼列印出我們關注的資訊,然後把這個指令碼放到.bashrc裡,這樣每次登陸系統就會自動調用這個指令碼來運行,輸出當前的系統資訊,既然想清楚了,那就動手進入今天的主題,用我們今天的主角python的psutil模組來實現擷取系統狀態, 該模組可以擷取正在啟動並執行進程資訊和系統的CPU及記憶體的利用率,這個模組功能非常強大,另外它還是跨平台的,在其它系統上也能很好的運行,往下我們來看一個實際的例子來展示下如何使用psutil模組:
#!/usr/bin/env python
#coding:utf-8
import psutil
import time
import sys
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-t", "--time", dest="time",
help="此參數可查看當前下載占的頻寬,-t是測試時間", metavar="10")
parser.add_option("-d", "--deamon",action="store_false", dest="deamon", default=True,
help="後台運行此指令碼")
def Sysinfo():
Boot_Start = time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(psutil.boot_time()))
time.sleep(0.5)
Cpu_usage = psutil.cpu_percent()
RAM = int(psutil.virtual_memory().total/(1027*1024))
RAM_percent = psutil.virtual_memory().percent
Swap = int(psutil.swap_memory().total/(1027*1024))
Swap_percent = psutil.swap_memory().percent
Net_sent = psutil.net_io_counters().bytes_sent
Net_recv = psutil.net_io_counters().bytes_recv
Net_spkg = psutil.net_io_counters().packets_sent
Net_rpkg = psutil.net_io_counters().packets_recv
BFH = r'%'
print " \033[1;32m開機時間:%s\033[1;m" % Boot_Start
print " \033[1;32m當前CPU使用率:%s%s\033[1;m" % (Cpu_usage,BFH)
print " \033[1;32m實體記憶體:%dM\t使用率:%s%s\033[1;m" % (RAM,RAM_percent,BFH)
print "\033[1;32mSwap記憶體:%dM\t使用率:%s%s\033[1;m" % (Swap,Swap_percent,BFH)
print " \033[1;32m發送:%d Byte\t發送包數:%d個\033[1;m" % (Net_sent,Net_spkg)
print " \033[1;32m接收:%d Byte\t接收包數:%d個\033[1;m" % (Net_recv,Net_rpkg)
for i in psutil.disk_partitions():
print " \033[1;32m盤符: %s 掛載點: %s 使用率: %s%s\033[1;m" % (i[0],i[1],psutil.disk_usage(i[1])[3],BFH)
def Net_io(s):
x = 0
sum = 0
while True:
if x >= s:
break
r1 = psutil.net_io_counters().bytes_recv
time.sleep(1)
r2 = psutil.net_io_counters().bytes_recv
y = r2 - r1
print "%.2f Kb/s" % (y / 1024.0)
sum += y
x += 1
result = sum / x
print "\033[1;32m%s秒內平均速度:%.2f Kb/s \033[1;m" % (x,result / 1024.0)
if __name__ == "__main__":
(options, args) = parser.parse_args()
if options.time:
Net_io(int(options.time))
else:
Sysinfo()
指令碼運行方式有2種,如果不加參數可以直接輸出當前作業系統資訊,例如:
[root@test demo_script]# python get_sysinfo.py
開機時間:2015-09-16 15:21:19
當前CPU使用率:2.0%
實體記憶體:3991M 使用率:22.2%
Swap記憶體:0M 使用率:0.0%
發送:47886457797 Byte 發送包數:74127845個
接收:102287702165 Byte 接收包數:952507264個
盤符: /dev/xvda1 掛載點: / 使用率: 44.2%
另一種方式是加入-t參數,後面跟一個數字,查看給定秒內的平均網路速度,如下:
[root@test demo_script]# python get_sysinfo.py -t 10
0.08 Kb/s
0.05 Kb/s
0.04 Kb/s
0.04 Kb/s
0.04 Kb/s
0.04 Kb/s
0.04 Kb/s
0.08 Kb/s
0.04 Kb/s
0.04 Kb/s
10秒內平均速度:0.05 Kb/s
關於psutil模組的更多用法,大家可以查看這個網站http://pythonhosted.org/psutil/,裡面寫的非常詳細。