Python系统资源枚举

Python系统资源枚举,python,cpu,enumeration,ram,Python,Cpu,Enumeration,Ram,我正在尝试获取系统信息。我必须避免安装需要运行最新版本python的第三方软件包、库或模块。这仍在早期开发阶段,目前仅在Ubuntu 10.04上测试,但我将在稍后使用它。我在获取正确的内存使用信息方面遇到了问题 到目前为止,我得到的是: #! /usr/bin/python import platform import multiprocessing import os print "\nEnumerating Available System Resources..." print "

我正在尝试获取系统信息。我必须避免安装需要运行最新版本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%,则不继续。我想了解一下这些函数,但现在主要关心的是内存使用率。我已经做了几个小时了,需要一些新鲜的眼睛。谢谢

改用
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
以字节为单位输出

免费
应该可以在/proc/meminfo所在的任何地方使用

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

used/total
(used-cached)/total

但请注意,这在linux上可能会产生误导,因为使用的值包括任何缓存文件。因此,要真正准确地计算被锁定的内存,您可以使用:

used/total
(used-cached)/total


改用
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
以字节为单位输出

免费
应该可以在/proc/meminfo所在的任何地方使用

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

used/total
(used-cached)/total

但请注意,这在linux上可能会产生误导,因为使用的值包括任何缓存文件。因此,要真正准确地计算被锁定的内存,您可以使用:

used/total
(used-cached)/total


这不是对我发布的任何问题的回答。我不想使用任何其他工具或*nix cmd。我只是想在我以前的帖子中增加一个。我只需要以百分比表示使用了多少ram,以便在脚本超过阈值时停止脚本。这应该是从MemTotal中减去MemFree得到MemUsed,然后将其转换成一个百分比。如果这听起来很刺耳,我很抱歉。我只是读了它,并不是故意让它听起来那么糟糕。我的脚本有一个干净的输出,我希望保持这种方式,因为一些年轻人将使用这个脚本。这是一个受损服务器调查脚本的开始,有助于加快速度。我们有很多服务器,无法从系统中安装或删除软件包/软件。我很感激你的回答,但这不是我想要的。谢谢。是的,我忘了回答确切的问题。请参阅我的最新答案。当前代码的问题是
meminfo
包含类似于
'1343434 kb'
的内容,即无法直接转换为整数的字符串。谢谢。我没想到。我仍然无法让它返回百分比。我一直在尝试你提供的方法。我应该把(已用缓存)/总计放在哪里?比如说,您有
used=100
cached=100
,和
total=400
。然后您可以执行类似于
percent=(已用缓存)/total的操作。你可以将结果乘以100,得到100的值(即0-100而不是0-1)。这不是对我发布的任何问题的回答。我不想使用任何其他工具或*nix cmd。我只是想在我以前的帖子中增加一个。我只需要以百分比表示使用了多少ram,以便在脚本超过阈值时停止脚本。这应该是从MemTotal中减去MemFree得到MemUsed,然后将其转换成一个百分比。如果这听起来很刺耳,我很抱歉。我只是读了它,并不是故意让它听起来那么糟糕。我的脚本有一个干净的输出,我希望保持这种方式,因为一些年轻人将使用这个脚本。这是一个受损服务器调查脚本的开始,有助于加快速度。我们有很多服务器,无法从系统中安装或删除软件包/软件。我很感激你的回答,但这不是我想要的。谢谢。是的,我忘了回答确切的问题。请参阅我的最新答案。当前代码的问题是
meminfo
包含类似于
'1343434 kb'
的内容,即无法直接转换为整数的字符串。谢谢。我没想到。我仍然无法让它返回百分比。我一直在尝试你提供的方法。我应该把(已用缓存)/总计放在哪里?比如说,您有
used=100
cached=100
,和
total=400
。然后您可以执行类似于
percent=(已用缓存)/total的操作。您可以将结果乘以100,得到100的缩放值(即0-100而不是0-1)。