《如何使用Python获取Linux的系统信息》
在Linux系统管理和自动化运维场景中,获取系统信息是基础且重要的任务。Python凭借其丰富的标准库和第三方生态,能够高效地完成这一工作。本文将详细介绍如何使用Python获取Linux系统的硬件信息、操作系统参数、网络状态及进程数据,并提供可复用的代码示例。
一、系统信息获取基础
Python通过标准库和第三方模块可以覆盖系统信息获取的多个维度。标准库如os
、platform
、psutil
(需安装)提供了跨平台的基础支持,而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可通过文件读取或调用lshw
、dmidecode
等命令获取。
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_partitions
和psutil.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_addrs
和subprocess
调用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. 自动化监控:结合cron
或systemd
定时执行信息收集
2. 资源预警:当CPU/内存使用率超过阈值时发送告警
3. 性能分析:长期收集数据生成性能趋势图
4. 配置审计:对比不同时间点的系统配置变化
关键词:Python、Linux系统信息、psutil模块、进程监控、硬件信息、网络状态、系统监控、自动化运维
简介:本文详细介绍了使用Python获取Linux系统信息的多种方法,涵盖CPU、内存、磁盘、网络和进程等核心维度,提供了基于标准库和psutil模块的完整代码示例,并实现了综合性的系统信息收集器,适用于自动化运维和性能监控场景。