我习惯在顶部的 Gnome 面板中进行系统监控:CPU、温度、网络、风扇速度。(见下面的截图)
在 Unity 中,顶部面板被锁定,无法显示窗口名称和全局菜单,因此我无法添加面板小程序。所以我的问题是:
有没有办法在 Unity 中替代这种系统监控(始终可见,不占用太多空间)?
答案1
与旧的 gnome 指示器完全一样:http://www.webupd8.org/2011/05/network-memory-and-cpu-usage-indicator.html#more
链接中的注释:安装后,从 Dash 启动系统负载指示器。与旧的 gnome 小程序不同,这是将这些指示器添加到面板的方法。
答案2
我发现以下问题和答案帮我解决了这个问题。它包含旧小程序(称为应用程序指示器)的替代品列表。不幸的是,并非所有这些小程序都可用于 natty,但至少我得到了一个非常基本的系统负载监视器(indicator-sysmonitor)和一个天气指示器(indicator-weather)。
点击按钮进行安装:
答案3
下面是我用 Python 编写的一个快速而粗糙的系统监视器:
它使用“系统监视器指示器”(这里)来调用我编写的脚本。使用方法如下:
安装
indicator-sysmonitor
。为此,请运行以下命令:sudo apt-add-repository ppa:alexeftimie/ppa && sudo apt-get update && sudo apt-get install indicator-sysmonitor
将以下脚本复制到名为 sysmonitor 的文件中
使脚本可执行(
chmod +x path-to-file
)点击指标并选择“首选项”。
选择“使用此命令”并为其提供 sysmonitor 文件的路径。
代码如下:
#!/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
编辑:如果您想要内存使用情况(如“top”报告),请添加以下行
memperc = int(100*float(psutil.used_phymem())/float(psutil.TOTAL_PHYMEM))
outstr += "mem: "+str(memperc)+"%\t"
如果您拥有 psutil 2.0 版本,那么您可以使用以下行获取 GNOME 系统监视器报告的内存使用情况:
memperc = int(100*float(psutil.used_phymem()-psutil.cached_phymem())/float(psutil.TOTAL_PHYMEM))
如果你的空间很小,并且你希望使用网速单位(b、k、M),你也可以使用它
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)
答案4
我对这个问题的看法:https://gist.github.com/982939
截屏: