位置: 文档库 > Python > 如何使用Python获取Linux的系统信息

如何使用Python获取Linux的系统信息

金正日 上传于 2025-01-05 12:56

《如何使用Python获取Linux的系统信息》

在Linux系统管理和自动化运维场景中,获取系统信息是基础且重要的任务。Python凭借其丰富的标准库和第三方生态,能够高效地完成这一工作。本文将详细介绍如何使用Python获取Linux系统的硬件信息、操作系统参数、网络状态及进程数据,并提供可复用的代码示例。

一、系统信息获取基础

Python通过标准库和第三方模块可以覆盖系统信息获取的多个维度。标准库如osplatformpsutil(需安装)提供了跨平台的基础支持,而subprocess模块可直接调用Linux命令获取更详细的数据。

1.1 使用标准库获取基础信息

通过platform模块可快速获取系统版本、内核信息等:

import platform

def get_system_info():
    print(f"系统名称: {platform.system()}")
    print(f"节点名称: {platform.node()}")
    print(f"发行版本: {platform.release()}")
    print(f"版本信息: {platform.version()}")
    print(f"机器类型: {platform.machine()}")
    print(f"处理器: {platform.processor()}")

if __name__ == "__main__":
    get_system_info()

输出示例:

系统名称: Linux
节点名称: ubuntu-server
发行版本: 5.4.0-135-generic
版本信息: #152-Ubuntu SMP Wed Nov 23 20:19:22 UTC 2022
机器类型: x86_64
处理器: x86_64

1.2 使用psutil获取详细资源信息

psutil是跨平台的系统监控库,可获取CPU、内存、磁盘等详细信息。安装命令:pip install psutil

import psutil

def get_cpu_info():
    print(f"CPU逻辑核心数: {psutil.cpu_count(logical=True)}")
    print(f"CPU物理核心数: {psutil.cpu_count(logical=False)}")
    print(f"CPU使用率: {psutil.cpu_percent(interval=1)}%")

def get_memory_info():
    mem = psutil.virtual_memory()
    print(f"总内存: {mem.total / (1024**3):.2f} GB")
    print(f"可用内存: {mem.available / (1024**3):.2f} GB")
    print(f"内存使用率: {mem.percent}%")

if __name__ == "__main__":
    get_cpu_info()
    get_memory_info()

二、硬件信息获取

Linux系统的硬件信息通常存储在/proc/sys目录下,Python可通过文件读取或调用lshwdmidecode等命令获取。

2.1 获取CPU信息

通过/proc/cpuinfo文件解析CPU详情:

def get_cpu_details():
    with open('/proc/cpuinfo', 'r') as f:
        cpu_info = {}
        current_key = ""
        for line in f:
            line = line.strip()
            if not line:
                continue
            if ':' in line:
                key, value = line.split(':', 1)
                current_key = key.strip()
                cpu_info[current_key] = value.strip()
            else:
                if current_key:
                    cpu_info[current_key] += "\n" + line.strip()
        print("CPU型号:", cpu_info.get('model name', '未知'))
        print("CPU频率:", cpu_info.get('cpu MHz', '未知'), "MHz")

get_cpu_details()

2.2 获取磁盘信息

使用psutil.disk_partitionspsutil.disk_usage获取磁盘分区和使用情况:

def get_disk_info():
    partitions = psutil.disk_partitions()
    for partition in partitions:
        print(f"设备: {partition.device}")
        print(f"挂载点: {partition.mountpoint}")
        print(f"文件系统类型: {partition.fstype}")
        usage = psutil.disk_usage(partition.mountpoint)
        print(f"总空间: {usage.total / (1024**3):.2f} GB")
        print(f"已用空间: {usage.used / (1024**3):.2f} GB")
        print(f"使用率: {usage.percent}%")
        print("-" * 30)

get_disk_info()

三、网络信息获取

网络信息包括接口状态、连接数、路由表等,可通过psutil.net_if_addrssubprocess调用ip命令获取。

3.1 获取网络接口信息

def get_network_info():
    addrs = psutil.net_if_addrs()
    for interface, addresses in addrs.items():
        print(f"接口: {interface}")
        for addr in addresses:
            print(f"  地址族: {'IPv4' if addr.family == 2 else 'IPv6' if addr.family == 10 else '其他'}")
            print(f"  地址: {addr.address}")
            print(f"  掩码: {addr.netmask}")
            print(f"  广播地址: {addr.broadcast if hasattr(addr, 'broadcast') else '无'}")
        print("-" * 30)

get_network_info()

3.2 获取网络连接信息

def get_connections_info():
    connections = psutil.net_connections(kind='inet')
    for conn in connections:
        print(f"本地地址: {conn.laddr.ip}:{conn.laddr.port}")
        print(f"远程地址: {conn.raddr.ip if conn.raddr else '无'}:{conn.raddr.port if conn.raddr else '无'}")
        print(f"状态: {conn.status}")
        print(f"进程PID: {conn.pid if conn.pid else '无'}")
        print("-" * 30)

get_connections_info()

四、进程信息获取

进程管理是系统监控的核心,psutil提供了完整的进程操作接口。

4.1 获取所有进程列表

def list_processes():
    for proc in psutil.process_iter(['pid', 'name', 'username', 'cpu_percent', 'memory_percent']):
        try:
            print(f"PID: {proc.info['pid']}")
            print(f"名称: {proc.info['name']}")
            print(f"用户: {proc.info['username']}")
            print(f"CPU使用率: {proc.info['cpu_percent']}%")
            print(f"内存使用率: {proc.info['memory_percent']}%")
            print("-" * 30)
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass

list_processes()

4.2 监控特定进程

def monitor_process(pid):
    try:
        p = psutil.Process(pid)
        print(f"进程名称: {p.name()}")
        print(f"执行路径: {p.exe()}")
        print(f"命令行: {' '.join(p.cmdline())}")
        print(f"创建时间: {p.create_time()}")
        print(f"线程数: {p.num_threads()}")
        mem_info = p.memory_info()
        print(f"RSS内存: {mem_info.rss / (1024**2):.2f} MB")
    except psutil.NoSuchProcess:
        print(f"进程 {pid} 不存在")

monitor_process(1)  # 监控init进程

五、综合应用:系统信息收集器

将上述功能整合为一个完整的系统信息收集脚本:

import psutil
import platform
from datetime import datetime

class SystemInfoCollector:
    def __init__(self):
        self.info = {
            "timestamp": datetime.now().isoformat(),
            "system": {},
            "cpu": {},
            "memory": {},
            "disks": [],
            "network": {},
            "processes": []
        }

    def collect_system_info(self):
        self.info["system"] = {
            "name": platform.system(),
            "node": platform.node(),
            "release": platform.release(),
            "version": platform.version(),
            "machine": platform.machine()
        }

    def collect_cpu_info(self):
        self.info["cpu"] = {
            "logical_cores": psutil.cpu_count(logical=True),
            "physical_cores": psutil.cpu_count(logical=False),
            "usage": psutil.cpu_percent(interval=1)
        }

    def collect_memory_info(self):
        mem = psutil.virtual_memory()
        self.info["memory"] = {
            "total": mem.total,
            "available": mem.available,
            "used": mem.used,
            "percent": mem.percent
        }

    def collect_disk_info(self):
        partitions = psutil.disk_partitions()
        for partition in partitions:
            usage = psutil.disk_usage(partition.mountpoint)
            self.info["disks"].append({
                "device": partition.device,
                "mountpoint": partition.mountpoint,
                "fstype": partition.fstype,
                "total": usage.total,
                "used": usage.used,
                "free": usage.free,
                "percent": usage.percent
            })

    def collect_network_info(self):
        self.info["network"]["interfaces"] = []
        addrs = psutil.net_if_addrs()
        for interface, addresses in addrs.items():
            interface_info = {"name": interface, "addresses": []}
            for addr in addresses:
                interface_info["addresses"].append({
                    "family": "IPv4" if addr.family == 2 else "IPv6" if addr.family == 10 else "Other",
                    "address": addr.address,
                    "netmask": addr.netmask,
                    "broadcast": addr.broadcast if hasattr(addr, "broadcast") else None
                })
            self.info["network"]["interfaces"].append(interface_info)

    def collect_process_info(self, top_n=5):
        processes = []
        for proc in psutil.process_iter(['pid', 'name', 'cpu_percent', 'memory_percent']):
            try:
                processes.append({
                    "pid": proc.info['pid'],
                    "name": proc.info['name'],
                    "cpu_percent": proc.info['cpu_percent'],
                    "memory_percent": proc.info['memory_percent']
                })
            except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
                continue
        # 按CPU使用率排序
        processes.sort(key=lambda x: x["cpu_percent"], reverse=True)
        self.info["processes"] = processes[:top_n]

    def collect_all(self):
        self.collect_system_info()
        self.collect_cpu_info()
        self.collect_memory_info()
        self.collect_disk_info()
        self.collect_network_info()
        self.collect_process_info()
        return self.info

if __name__ == "__main__":
    collector = SystemInfoCollector()
    system_info = collector.collect_all()
    import json
    print(json.dumps(system_info, indent=2))

六、性能优化与注意事项

1. 频率控制:高频获取系统信息可能影响性能,建议设置合理的采集间隔

2. 权限管理:部分信息需要root权限才能获取

3. 异常处理:妥善处理进程终止、权限不足等异常情况

4. 数据存储:可将收集的信息存储到数据库或日志文件中进行长期分析

七、扩展应用场景

1. 自动化监控:结合cronsystemd定时执行信息收集

2. 资源预警:当CPU/内存使用率超过阈值时发送告警

3. 性能分析:长期收集数据生成性能趋势图

4. 配置审计:对比不同时间点的系统配置变化

关键词:Python、Linux系统信息、psutil模块、进程监控硬件信息网络状态系统监控自动化运维

简介:本文详细介绍了使用Python获取Linux系统信息的多种方法,涵盖CPU、内存、磁盘、网络和进程等核心维度,提供了基于标准库和psutil模块的完整代码示例,并实现了综合性的系统信息收集器,适用于自动化运维和性能监控场景。