0

我正在尝试获取系统信息。我必须避免安装需要最新版本的 python 才能运行的第三方包和库或模块。这仍处于早期开发阶段,目前仅在 Ubuntu 10.04 上进行了测试,但我稍后会使用它。我无法获取有关内存使用的正确信息。

到目前为止,我所拥有的是:

#! /usr/bin/python

import platform
import multiprocessing
import os

print "\nEnumerating Available System Resources..."

print "\n++++++++++ OS Name and version ++++++++++"

print "Platform:", platform.system()
print "Kernel:", platform.release()
print "Distro:", platform.linux_distribution()
print "Architecture:", platform.architecture()

print "\n++++++++++ CPU Cores ++++++++++"
p = os.popen("ps aux|awk 'NR > 0{s +=$3};END{print s}'").read()
print "Cores:", multiprocessing.cpu_count(), '\nCPU Load:', p

print "\n++++++++++ System Memory ++++++++++\n"

def meminfo():
    meminfo=dict()

    with os.popen('cat /proc/meminfo') as f:
        for line in f:
            meminfo[line.split(':')[0]] = line.split(':')[1].strip()
    return meminfo

if __name__=='__main__':
    meminfo = meminfo()
    print('Total Memory: {0}'.format(meminfo['MemTotal']))
    print('Free Memory: {0}'.format(meminfo['MemFree']))

问题是最后一部分我得到了正确的内存统计信息,但我还需要以百分比格式添加“使用”部分。不过,我不知道如何正确计算。

我需要这个,因为我工作的一些系统可能在 ram 上被挖掘出来,我不能让脚本使机器崩溃,所以我还需要在这里添加一些东西来评估 RAM 百分比和 CPU 百分比,而不是如果存在某些条件,例如 CPU 负载超过 75% 且 RAM 剩余少于 5%,则继续。我想对这些功能有所了解,但现在主要关注的是获取内存使用百分比。我已经在这几个小时了,可以用一些新鲜的眼睛。谢谢!

4

1 回答 1

3

改用free命令怎么样?

import os
import re
def meminfo():

    with os.popen('free -m') as f:
        output = f.read()

    fields = re.search(r'Mem\:\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)\s+(\d+)',
            output,re.M).group
    return dict(total=fields(1),used=fields(2),free=fields(3),
            shared=fields(4),buffers=fields(5),cached=fields(6))

print meminfo()

输出:

{'used': '3292', 'buffers': '105', 'cached': '2063', 'shared': '0', 'total': '3550', 'free': '257'}

请注意,-m以兆字节为单位输出所有内容。您可以使用-k千字节、-g千兆字节或仅以free字节为单位输出。

free应该几乎可以在 /proc/meminfo 所在的任何地方使用。

至于您最初的问题,要获得使用百分比,您将使用:

used/total

或者

(total-free)/total

但请注意,这在 linux 上可能会产生误导,因为 used 值包括任何缓存文件。因此,对于一个真正准确的被锁定的内存计数,可以这么说,你可以使用:

(used-cached)/total

或者

(total-free-cached)/total
于 2013-06-09T05:01:40.170 回答