Đây là một màn hình hệ thống nhanh và bẩn mà tôi đã hack cùng với python:
Nó sử dụng "Chỉ báo màn hình hệ thống" ( ở đây ) để gọi tập lệnh mà tôi đã viết. Để dùng nó:
cài đặt indicator-sysmonitor
. Để làm điều đó, hãy chạy lệnh sau:
sudo apt-add-repository ppa:alexeftimie/ppa && sudo apt-get update && sudo apt-get install indicator-sysmonitor
sao chép tập lệnh dưới đây vào một tập tin gọi là sysmonitor
làm cho tập lệnh thực thi ( chmod +x path-to-file
)
nhấp vào chỉ báo và chọn "Tùy chọn".
chọn "sử dụng lệnh này" và cung cấp cho nó đường dẫn đến tệp sysmonitor.
đây là mã:
#!/usr/bin/python
import re
import sys
import time
import psutil
#Functions:_ __ __ __ __ __ __ __ __ __ __ __
#__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \_
#interface |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
net_re = re.compile(r"\s*\S+:\s+(\d+)\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+(\d+)\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+")
def getInOut():
"""
Get a readout of bytes in and out from /proc/net/dev.
"""
netfile = "/proc/net/dev"
try: f = open(netfile)
except:
sys.stderr.write("ERROR: can't open "+netfile+".\n")
sys.exit(2)
f.readline() #Burn the top header line.
f.readline() #Burn the second header line.
inb = 0
outb = 0
for line in f:
m = net_re.match(line)
inb += int(m.group(1))
outb += int(m.group(2))
f.close()
return (inb,outb)
def sampleNet():
"""
Get a sample of I/O from the network interfaces.
"""
return makeSample(getInOut)
def makeSample(function):
inlist = list()
outlist = list()
(inbytes, outbytes) = function()
inlist.append(inbytes)
outlist.append(outbytes)
time.sleep(1)
(inbytes, outbytes) = function()
inlist.append(inbytes)
outlist.append(outbytes)
return (inlist[1] - inlist[0], outlist[1] - outlist[0])
def diskstatWrapper():
"""
Wrapper for the diskstats_parse function that returns just the in and out.
"""
ds = diskstats_parse("sda")
return (ds["sda"]["writes"], ds["sda"]["reads"])
def sampleDisk():
"""
Get a sample of I/O from the disk.
"""
return makeSample(diskstatWrapper)
def diskstats_parse(dev=None):
"""
I found this on stackoverflow.
(http://stackoverflow.com/questions/3329165/python-library-for-monitoring-proc-diskstats)
"""
file_path = '/proc/diskstats'
result = {}
# ref: http://lxr.osuosl.org/source/Documentation/iostats.txt
columns_disk = ['m', 'mm', 'dev', 'reads', 'rd_mrg', 'rd_sectors',
'ms_reading', 'writes', 'wr_mrg', 'wr_sectors',
'ms_writing', 'cur_ios', 'ms_doing_io', 'ms_weighted']
columns_partition = ['m', 'mm', 'dev', 'reads', 'rd_sectors', 'writes', 'wr_sectors']
lines = open(file_path, 'r').readlines()
for line in lines:
if line == '': continue
split = line.split()
if len(split) != len(columns_disk) and len(split) != len(columns_partition):
# No match
continue
data = dict(zip(columns_disk, split))
if dev != None and dev != data['dev']:
continue
for key in data:
if key != 'dev':
data[key] = int(data[key])
result[data['dev']] = data
return result
#MAIN: __ __ __ __ __ __ __ __ __ __ __ __
#__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \__/ \_
(indiff, outdiff) = sampleNet()
outstr = ""
outstr += "cpu: "+str(int(psutil.cpu_percent()))+"%\t"
outstr += "net: "+str(indiff/1000)+"|"+str(outdiff/1000)+" K/s\t"
(diskin, diskout) = sampleDisk()
outstr += "disk: "
if(diskin):
outstr += "+"
else:
outstr += "o"
outstr += "|"
if(diskout):
outstr += "+"
else:
outstr += "o"
print outstr
EDIT: nếu bạn muốn sử dụng bộ nhớ (như báo cáo của "top"), hãy thêm các dòng
memperc = int(100*float(psutil.used_phymem())/float(psutil.TOTAL_PHYMEM))
outstr += "mem: "+str(memperc)+"%\t"
Nếu bạn có phiên bản 2.0 của psutil thì bạn có thể sử dụng bộ nhớ theo báo cáo của Trình giám sát hệ thống Gnome với dòng sau:
memperc = int(100*float(psutil.used_phymem()-psutil.cached_phymem())/float(psutil.TOTAL_PHYMEM))
Nếu bạn có ít không gian và bạn muốn có các đơn vị cho tốc độ mạng (b, k, M), bạn cũng có thể sử dụng đơn vị này
def withUnit(v):
if v<1024:
return "%03d" % v+"b";
if v<1024**2:
s= ("%f" % (float(v)/1024))[:3];
if s[-1]=='.':
s=s[:-1]
return s +"k";
return ("%f" % (float(v)/(1024**2)))[:3] +"M";
(indiff, outdiff) = sampleNet()
outstr = ""
outstr += "c"+ "%02d" % int(psutil.cpu_percent())+" "
outstr += "m"+ "%02d" % int((100*float(psutil.used_phymem())/float(psutil.TOTAL_PHYMEM)))+" "
outstr += "d"+withUnit(indiff)+" u"+withUnit(outdiff)