【Python入门指北】服务器信息清洗

news2025/1/11 11:05:48

服务器信息清洗


文章目录

  • 服务器信息清洗
    • 一、 subprocess 执行本机命令
    • 二、 获取服务器的硬件基础信息
      • 1. 基础信息
      • 2. 厂家和产品信息
      • 3. CPU 信息
        • 3.1 查看物理CPU型号
        • 3.2 查看物理CPU颗数
        • 3.3 查看每颗物理 CPU 的核心数
      • 4. 内存信息
    • 练习
      • 内存处理参考代码


在这里插入图片描述


一、 subprocess 执行本机命令

subprocessgetoutput() 方法可以接收一个字符串的参数,这个参数会被认为是当前操作系统的命令去执行,并返回字符串类型的命令执行结果,假设命令出错,会返回相应的错误信息。

比如我们执行一条命令,来获取的厂商机器信息
目标是得到这些信息

  • 厂商 就是 Manufacturer 对应的值 比如 Del
  • 服务器型号(名字) 就是 Product Name 对应的值 比如 Del R710
  • 服务器序列号 就是 Serial Number 对应的值
[root@qfedu.com ~]# rpm -q dmidecode
dmidecode-3.1-2.el7.x86_64
[root@qfedu.com ~]# dmidecode -q -t 1 2>/dev/null
System Information
	Manufacturer: Alibaba Cloud
	Product Name: Alibaba Cloud ECS
	Version: pc-i440fx-2.1
	Serial Number: 0f7e3d86-7742-4612-9f93-e3a9e4754157
	UUID: 0f7e3d86-7742-4612-9f93-e3a9e4754157
	Wake-up Type: Power Switch
	SKU Number: Not Specified
	Family: Not Specified

在 python 中可以这样做

In [1]: import subprocess

In [2]: prod_info = "dmidecode -q -t 1 2>/dev/null"

In [3]: prod_info
Out[3]: 'dmidecode -q -t 1 2>/dev/null'

In [4]: subprocess.getoutput(prod_info)
Out[4]: 'System Information\n\tManufacturer: Alibaba Cloud\n\tProduct Name: Alibaba Cloud ECS\n\tVersion: pc-i440fx-2.1\n\tSerial Number: 0f7e3d86-7742-4612-9f93-e3a9e4754157\n\tUUID: 0f7e3d86-7742-4612-9f93-e3a9e4754157\n\tWake-up Type: Power Switch\n\tSKU Number: Not Specified\n\tFamily: Not Specified\n'

In [5]:

可以看到输出结果是一个整体的字符串,和 shell 中输出的少有不同,就是这里每一行后面都有一个换行符 ‘\n’
那我们要想对每一行进行处理,可以使用 split('\n') 进行分割,当然我们这里使用另一个方法 splitlines(), 它默认使用的分隔符就是换行符

In [5]: ret = subprocess.getoutput(prod_info)

In [6]: ret.splitlines()
Out[6]:
['System Information',
 '\tManufacturer: Alibaba Cloud',
 '\tProduct Name: Alibaba Cloud ECS',
 '\tVersion: pc-i440fx-2.1',
 '\tSerial Number: 0f7e3d86-7742-4612-9f93-e3a9e4754157',
 '\tUUID: 0f7e3d86-7742-4612-9f93-e3a9e4754157',
 '\tWake-up Type: Power Switch',
 '\tSKU Number: Not Specified',
 '\tFamily: Not Specified']

In [7]:

那接着我们即可以循环列表中的每个元素(也就是每行),在循环中处理每行内容,得到我们想要的数据

In [7]: for line in ret.splitlines():
   ...:     print(line)
   ...:
System Information
	Manufacturer: Alibaba Cloud
	Product Name: Alibaba Cloud ECS
	Version: pc-i440fx-2.1
	Serial Number: 0f7e3d86-7742-4612-9f93-e3a9e4754157
	UUID: 0f7e3d86-7742-4612-9f93-e3a9e4754157
	Wake-up Type: Power Switch
	SKU Number: Not Specified
	Family: Not Specified

In [8]: for line in ret.splitlines():
   ...:     if 'Manufacturer:' in line:
   ...:         print(line)
   ...:
	Manufacturer: Alibaba Cloud

可以看到我们拿到了我们需要的第一个数据,并且可以进行进一步的处理,比如转换成一个字典,其他可以如法炮制。

In [12]: prod_dic = {}
    ...: for line in ret.splitlines():
    ...:     k = ''
    ...:     line = line.strip()
    ...:     print(line)
    ...:     if ': ' in line:
    ...:         k, v = line.split(': ')
    ...:         print(k)
    ...:     if k == 'Manufacturer':
    ...:         prod_dic[k.lower()] = v
    ...:     elif k == 'Product Name':
    ...:         prod_dic[k.lower()] = v
    ...:     elif k == 'Serial Number':
    ...:         prod_dic[k.lower()] = v
    ...:

In [13]: prod_dic
Out[13]:
{'serial_number': '0f7e3d86-7742-4612-9f93-e3a9e4754157',
 'manufacturer': 'Alibaba Cloud',
 'product_name': 'Alibaba Cloud ECS'}

和我们的目标越来接近了,但你会发现有问题

  1. 多个判断语句导致代码臃肿
  2. 并且 if 语句中存在重复的代码

那继续优化,思路是可以提前定义一个映射的字典

#!/usr/bin/env python3
import subprocess

prod_info = 'dmidecode -q -t 1 2>/dev/null'

# 执行系统命令并返回结果
ret = subprocess.getoutput(prod_info)
prod_dic = {}

# 定义映射字典
map_dic = {
    "Manufacturer": "manufacturer",
    "Product Name": "pod_name",
    "Serial Number": "sn"
}

for line in ret.splitlines():
    line = line.strip()
    try:  # 异常处理语句
        k, v  = line.split(": ")
        if k in map_dic:
            # k = map_dic.get(k)
            prod_dic[map_dic.get(k)] = v
    except ValueError as e:
        print(e)
# print('....>>>')
print(prod_dic)
# 输出信息
{'manufacturer': 'VMware, Inc.', 'pod_name': 'VMware7,1', 'sn': 'VMware-56 4d 2b 4b 91 1e 48 15-5b d2 73 9c ec 98 da 22'}

二、 获取服务器的硬件基础信息

1. 基础信息

# 主机名
cmd_machine = 'uname -n'

# 内核版本
cmd_kernel = 'uname -r'

# 操作系统
cmd_os_version = "cat /etc/redhat-release

2. 厂家和产品信息

[root@qfedu.com]# dmidecode -q -t 1 2>/dev/null
System Information
	Manufacturer: Alibaba Cloud                   # 厂商
	Product Name: Alibaba Cloud ECS         #  机器型号
	Version: pc-i440fx-2.1
	Serial Number: 0f7e3d86-7742-4612-9f93-e3a9e4754157    
	UUID: 0f7e3d86-7742-4612-9f93-e3a9e4754157
	Wake-up Type: Power Switch
	SKU Number: Not Specified
	Family: Not Specified

3. CPU 信息

3.1 查看物理CPU型号

grep 'model name' /proc/cpuinfo | uniq 
In [1]: import subprocess

In [2]: cmd_cpu_name = "grep 'model name' /proc/cpuinfo | uniq"

In [3]: subprocess.getoutput(cmd_cpu_name)
Out[3]: 'model name\t: Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz'

In [4]: cpu_name = subprocess.getoutput(cmd_cpu_name).split(": ")[1]

In [5]: cpu_name
Out[5]: 'Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz'

In [6]: cpu = {"cpu_name": cpu_name}

In [7]: cpu
Out[7]: {'cpu_name': 'Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz'}

In [8]:

3.2 查看物理CPU颗数

grep 'physical id' /proc/cpuinfo | sort -u | wc -l
In [8]: cmd_cpu_pyc = "grep 'physical id' /proc/cpuinfo | sort -u | wc -l"

In [9]: subprocess.getoutput(cmd_cpu_pyc)
Out[9]: '1'

In [10]: cpu["pyc"] = int(subprocess.getoutput(cmd_cpu_pyc))

In [11]: cpu
Out[11]: {'cpu_name': 'Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz', 'cpu_pyc': 1}

In [12]:

3.3 查看每颗物理 CPU 的核心数

grep 'cpu cores' /proc/cpuinfo | uniq   # 每颗 CPU 的核心数,不是总核心数
In [13]: subprocess.getoutput("grep 'cpu cores' /proc/cpuinfo | uniq")
Out[13]: 'cpu cores\t: 1'

In [14]: cpu_cores_each = subprocess.getoutput("grep 'cpu cores' /proc/cpuinfo | uniq")

In [15]: cpu_cores_each = int(cpu_cores_each.split(": ")[1])

In [16]: cpu_cores_each
Out[16]: 1

In [17]: cpu["cores_each"] = cpu_cores_each

In [18]: cpu
Out[18]:
{'cpu_name': 'Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz',
 'cpu_num': 1,
 'cpu_cores_each': 1}

In [19]:

4. 内存信息

  • 阿里云虚拟主机
[root@qfedu.com]# dmidecode -q -t 17 2>/dev/null
Memory Device
	Total Width: Unknown
	Data Width: Unknown
	Size: 4096 MB             # 容量
	Form Factor: DIMM
	Set: None
	Locator: DIMM 0          # 插槽号
	Bank Locator: Not Specified
	Type: RAM                    # 类型  物理的有 DDR3 DDR4
	Type Detail: Other
	Speed: Unknown           # 速率  物理的有 1333 等
	Manufacturer: Alibaba Cloud
	Serial Number: Not Specified
	Asset Tag: Not Specified
	Part Number: Not Specified
	Rank: Unknown
	Configured Clock Speed: Unknown
	Minimum Voltage: Unknown
	Maximum Voltage: Unknown
	Configured Voltage: Unknown
  • 物理 R710 服务器
Memory Device
    Total Width: 72 bits
    Data Width: 64 bits
    Size: 8192 MB
    Form Factor: DIMM
    Set: 6
    Locator: DIMM_B2
    Bank Locator: Not Specified
    Type: DDR3
    Type Detail: Synchronous Registered (Buffered)
    Speed: 1333 MT/s
    Manufacturer: 00CE00B380CE
    Serial Number: 82B79F71
    Asset Tag: 02120363
    Part Number: M393B1K70DH0-YH9
    Rank: 2
Memory Device
    Total Width: 72 bits
    Data Width: 64 bits
    Size: 8192 MB
    Form Factor: DIMM
    Set: 6
    Locator: DIMM_B3
    Bank Locator: Not Specified
    Type: DDR3
    Type Detail: Synchronous Registered (Buffered)
    Speed: 1333 MT/s
    Manufacturer: 00CE00B380CE
    Serial Number: 32CDDE81
    Asset Tag: 02120361
    Part Number: M393B1K70CH0-YH9
    Rank: 2
Memory Device
    Total Width: 72 bits
    Data Width: 64 bits
    Size: No Module Installed
    Form Factor: DIMM
    Set: 4
    Locator: DIMM_B4
    Bank Locator: Not Specified
    Type: DDR3
    Type Detail: Synchronous
    Speed: Unknown
    Manufacturer:
    Serial Number:
    Asset Tag:
    Part Number:
    Rank: Unknown
Memory Device
    Total Width: 72 bits
    Data Width: 64 bits
    Size: 8192 MB
    Form Factor: DIMM
    Set: 5
    Locator: DIMM_B5
    Bank Locator: Not Specified
    Type: DDR3
    Type Detail: Synchronous Registered (Buffered)
    Speed: 1333 MT/s
    Manufacturer: 00CE04B380CE
    Serial Number: 85966B82
    Asset Tag: 02113621
    Part Number: M393B1K70DH0-YH9
    Rank: 2
Memory Device
    Total Width: 72 bits
    Data Width: 64 bits
    Size: 8192 MB
    Form Factor: DIMM
    Set: 6
    Locator: DIMM_B6
    Bank Locator: Not Specified
    Type: DDR3
    Type Detail: Synchronous Registered (Buffered)
    Speed: 1333 MT/s
    Manufacturer: 000000B380CE
    Serial Number: 00000000
    Asset Tag: 02121563
    Part Number:
    Rank: 2

练习

请使用以上信息,编写一个脚本,输出如下信息

{
	"base_info": {
		"host_name": "db_server",
		"kernel": "3.10.0-957.21.3.el7.x86_64",
		"os": "CentOS Linux release 7.6.1810 (Core)",
		'manufacturer': 'Alibaba Cloud',
		'pod_name': 'Alibaba Cloud ECS',
		'sn': '0f7e3d86-7742-4612-9f93-e3a9e4754157'
	},
	"cpu": {
		'name': 'Intel(R) Xeon(R) Platinum 8163 CPU @ 2.50GHz',
		'num': 1,
		'cores_each': 1
	},
	"mem": [
		{
			'capacity': '8192 MB',
			'slot': 'DIMM_A3',
			'model': 'DDR3',
			'speed': '1333 MT/s',
			'manufacturer': '00CE04B380CE',
			'sn': '8362A2F8'
		},
		{
			'capacity': 'No Module Installed',
			'slot': 'DIMM_A4',
			'model': 'DDR3',
			'speed': 'Unknown'
		}
        .......................
	]
}

内存源数据使用上面 R710 的,映射字典使用下面这个

key_map = {
        'Size': 'capacity',
        'Locator': 'slot',
        'Type': 'model',
        'Speed': 'speed',
        'Manufacturer': 'manufacturer',
        'Serial Number': 'sn',
}

内存处理参考代码

def parse(data):
    key_map = {
        'Size': 'capacity',
        'Locator': 'slot',
        'Type': 'model',
        'Speed': 'speed',
        'Manufacturer': 'manufacturer',
        'Serial Number': 'sn'
    }


   info_mem = []
    # 首先把服务器上的所有插槽分开,并发到一个列表中
    # 这个语法叫列表生成式, 表示循环中的元素为真时候,将 mem 添加到列表中
    memory_list = [ mem for mem in data.split('Memory Device') if mem]


    for item in memory_list:
        # 把每个插槽的信息放到一个字典中
        single_slot = {}
        
        for line in item.splitlines():
            line = line.strip()
            if len(line.split(': ')) == 2:
                key, val = line.split(': ')
                if key in key_map:
                    # 获取到映射字典的 value 作为新字典的 key
                    single_slot[key_map[key]] = val
        # 含有插槽信息的字典:
        # {'capacity': '8192 MB', 'slot': 'DIMM_A3', 'model': 'DDR3', 'speed': '1333 MT/s', 'manufacturer': '00CE04B380CE', 'sn': '8362A2F8'}
        
        # 由于存在多个内存插槽,每个插槽的号码是不一样的
        # 所以可以把当前内存的插槽号作为总体内存字典中的一个 key,值就是当前含有插槽信息的字典
        info_mem.append = single_slot
    return info_mem

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

智云通CRM:如何提前识别哪些客户爱说“不”?

有人说,做业务是最好的锻炼意志力方法,因为做业务的人经常会被客户拒绝甚至会扫地出门。被拒绝时,业务员一定要擦亮眼睛,善于察言观色,洞察客户的心理活动。透过观察了解客户为什么说“不”,客户拒绝情况有…

聚观早报 | 推特临时培训员工应对世界杯;世界杯足球内置传感器

今日要闻:推特临时培训员工应对世界杯;京东靠降本增效实现转亏为盈;世界杯足球内置传感器;艾格重返迪士尼CEO职位;特斯拉明年或开启收购计划 推特临时培训员工应对世界杯 据消息, 2022年世界杯拉开帷幕,推特的使用量即将激增,其维…

陆地卫星(Landsat)计划:50多年的星球档案

陆地卫星计划:陆地卫星1号至陆地卫星9号 1967年,NASA(美国国家航空与航天局) 提出了“地球资源技术卫星”计划,从此开始了在理论上对地球资源技术卫星系列的可行性研究,于是,陆地卫星 (Landsat…

汽车安全气囊设计?Abaqus/Part特殊建模方法-附案例step-by-step教学

作者 | 邓怡超 Abaqus/Part基于特征的建模功能可以说非常齐全,基本能够满足一般的分析要求,更复杂的模型则可以通过与专业三维建模软件之间的接口来导入,今天要说的是部件的另外一种建模方法。 有一种类型的分析,部件自身的初始…

坚持自学软件测试,半年的辛苦没有白费,不过才拿到10k的offer

找软件测试的工作只用了一周的时间,因为自己的年纪已经25岁,所以在简历上包装了两年的工作经验,但是我学的技术水平自认为还可以,因为我当时自学时用的教程比较有深度。 之所以要转行,我相信做机械工作的朋友都明白&a…

神经网络-前向传播Forward propagation

前向传播Forward propagation 前向传播算法就是: 将上一层的输出作为下一层的输入,并计算下一层的输出,一直到运算到输出层为止 在正式介绍前向传播前,先简单介绍计算图(Computational Graph)的概念。 yw…

LiDAR 完整指南介绍:激光探测和测距

什么是激光探测和测距 (LiDAR)? LiDAR 的全称是 Light Detection and Ranging (激光探测及测距),LIDAR 是一种主动测量方式,主要由激光发射部分、接收部分组成、信号处理部分组成,从其名称可以发现 LIDAR 的两个主要基本功能是测…

关于我的家乡网页设计主题题材——梧州14页HTML+CSS网页

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法,如盒子的嵌套、浮动、margin、border、background等属性的使用,外部大盒子设定居中,内部左中右布局,下方横向浮动排列,大学学习的前端知识点和布局方式都有…

iOS关于列表布局的几种实现方式小结

式 ,功能的要求是最多六行,动态展示。当时想到的方案是,抽象出一个cell,初始化六个标签,动态的控制显示和隐藏,这样功能上没有问题,就是代码有些冗余。请教了身边的美女同事,她那边的思路是用UI…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.17 发送多部件邮件

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.17 发送多部件邮件5.17.1 发送多部件邮件5.17.2 添…

Python脚本之并发执行加密方法【一】

本文为博主原创,未经授权,严禁转载及使用。 本文链接:https://blog.csdn.net/zyooooxie/article/details/125650427 之前写过一篇 JMeter性能测试之参数加密【一】,现在把后面的补上。实际第一篇就写完了 JMeter压测遇到加密接口…

Java Class11

Java Class11 集合 概念 集合是用于存储对象的工具类容器,实现了常用的数据结构,提供了一系列公开的方法用于删除、修改、查找和遍历数据,降低了日常开发成本。 三种集合 Set set集合中元素是无序、不可重复的 List list集合中元素是从前到…

公众号免费搜题功能搭建

公众号免费搜题功能搭建 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转&#xf…

基于C语言实现进度条 | 附源码

进度条的应用在软件中无处不在,拷贝一个文件需要一个进度条,加载一个文件也需要一个进度条,来标志完成与否。 那么 ,一个进度条有哪些元素呢: 一个不断向右生长的容器(直观的看出当前的进度) …

Spring的循环依赖问题

Spring中循环依赖场景有: 构造器的循环依赖(构造器注⼊) Field 属性的循环依赖(set注⼊) 各场景下循环依赖解决的情况 单例 bean 构造器参数循环依赖(⽆法解决) 构造器在Bean的生命周期中实例…

GitHub最新发布,阿里十年架构师手写版spring全家桶笔记全新开源

嗨咯,大家好! 没错,又是我,还跟前面一样,有好东西我才会出现。那是什么好东西呢?今天啊,给他分享阿里在Github最新发布的spring全家桶笔记第九版,这份笔记一共分三份:sp…

G1垃圾回收器

概述 官网 https://docs.oracle.com/en/java/javase/16/gctuning/garbage-first-g1-garbage-collector1.html#GUID-ED3AB6D3-FD9B-4447-9EDF-983ED2F7A573 简介 G1垃圾回收器可以同时回收新生代和老年代的对象,不需要两个垃圾回收器配合起来运作,他一…

高项 进度管理论文

七个过程: 项目进度管理包括为管理项目按时完成所需的7个过程,具体为: (1)规划进度管理:为规划、编制、管理、执行和控制项目进度而制定政策、程序和文档过程。 (2)定义活动&…

【C语言】初阶指针的简单使用 _指针运算 指针和数组的关系[初阶篇 _学习专用]

1.指针是什么? 在学习指针的时候,我们经常会看到下面这段代码: int main() {int a 10;int* pa &a;*pa 20; } 之前并没有接触过指针的朋友们看到后可能是一头雾水,根本不知道从哪里去理解;下面我们就通过一些…

STM32开发时HardFault错误的排查

STM32开发时HardFault错误的排查 本篇是 嵌入式开发-STM32硬件I2C驱动OLED屏 一文的扩展。 把相关的问题记录一下,给遇到HardFault_Handler问题的朋友做个参考。 故障现象 做STM32开发,经常遇到HardFault错误,也就是程序不会正常运行&…