1. 服务器信息采集脚本
任务说明
编写一个Python脚本,自动采集当前服务器的CPU、内存、磁盘、网络基础信息,并输出为JSON格式。脚本需在Linux服务器上直接运行,不依赖第三方库,仅使用Python标准库实现。
实现代码
#!/usr/bin/env python3
import json
import os
import socket
import platform
def get_cpu_info():
"""采集CPU信息:型号、核心数、使用率"""
cpu_info = {}
# CPU型号与核心数
with open('/proc/cpuinfo') as f:
lines = f.readlines()
model_names = [l.split(':')[1].strip() for l in lines if l.startswith('model name')]
cpu_info['model'] = model_names[0] if model_names else 'Unknown'
cpu_info['cores'] = len(model_names)
# CPU使用率(读取两次 /proc/stat 计算)
def read_cpu_times():
with open('/proc/stat') as f:
parts = f.readline().split()[1:]
return [int(x) for x in parts]
t1 = read_cpu_times()
time.sleep(0.1)
t2 = read_cpu_times()
idle_diff = (t2[3] + t2[4]) - (t1[3] + t1[4])
total_diff = sum(t2) - sum(t1)
cpu_info['usage_percent'] = round(100.0 * (1 - idle_diff / total_diff), 1)
return cpu_info
def get_memory_info():
"""采集内存信息:总量、可用量、使用率"""
mem_info = {}
with open('/proc/meminfo') as f:
lines = f.readlines()
data = {}
for line in lines:
parts = line.split(':')
if len(parts) == 2:
key = parts[0].strip()
value = parts[1].strip().split()[0]
data[key] = int(value)
total_kb = data.get('MemTotal', 0)
available_kb = data.get('MemAvailable', 0)
mem_info['total_mb'] = round(total_kb / 1024, 1)
mem_info['available_mb'] = round(available_kb / 1024, 1)
mem_info['usage_percent'] = round(100.0 * (1 - available_kb / total_kb), 1)
return mem_info
def get_disk_info():
"""采集磁盘信息:根分区总量、可用量、使用率"""
disk_info = {}
stat = os.statvfs('/')
total_bytes = stat.f_blocks * stat.f_frsize
free_bytes = stat.f_bfree * stat.f_frsize
used_bytes = total_bytes - free_bytes
disk_info['total_gb'] = round(total_bytes / (1024**3), 1)
disk_info['free_gb'] = round(free_bytes / (1024**3), 1)
disk_info['usage_percent'] = round(100.0 * used_bytes / total_bytes, 1)
return disk_info
def get_network_info():
"""采集网络信息:主机名、IP地址、网卡流量"""
net_info = {}
net_info['hostname'] = socket.gethostname()
# 获取非回环IPv4地址
ip_addr = 'Unknown'
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('8.8.8.8', 80))
ip_addr = s.getsockname()[0]
s.close()
except Exception:
pass
net_info['ip_address'] = ip_addr
# 网卡收发流量(读取 /proc/net/dev)
rx_bytes = tx_bytes = 0
with open('/proc/net/dev') as f:
lines = f.readlines()[2:] # 跳过前两行标题
for line in lines:
parts = line.split(':')
if len(parts) == 2:
iface = parts[0].strip()
if iface != 'lo': # 排除回环接口
stats = parts[1].split()
rx_bytes += int(stats[0])
tx_bytes += int(stats[8])
net_info['rx_bytes'] = rx_bytes
net_info['tx_bytes'] = tx_bytes
return net_info
def main():
import time # 供get_cpu_info内部使用
server_info = {
'os': platform.platform(),
'cpu': get_cpu_info(),
'memory': get_memory_info(),
'disk': get_disk_info(),
'network': get_network_info()
}
print(json.dumps(server_info, indent=2, ensure_ascii=False))
if __name__ == '__main__':
main()
运行方式
python3 server_info.py
验证方法
执行脚本后,观察输出是否为合法JSON格式,并包含以下字段:
os:操作系统描述字符串cpu.model:CPU型号名称cpu.cores:逻辑核心数(正整数)cpu.usage_percent:0~100之间的浮点数memory.total_mb与memory.available_mb:正浮点数disk.total_gb与disk.free_gb:正浮点数network.ip_address:本机非回环IPv4地址
可通过以下命令验证JSON格式合法性:
python3 server_info.py | python3 -m json.tool
若命令无报错且输出格式化后的JSON,则脚本工作正常。CPU使用率数值会随系统负载变化,属正常现象。
常见问题
- 脚本在macOS/Windows上无法运行:本脚本依赖Linux的
/proc文件系统,仅支持Linux环境。 - CPU使用率显示为0:两次读取间隔过短可能导致差值过小,可适当增大
time.sleep()的间隔值。 - 磁盘信息仅统计根分区:如需采集其他挂载点,可修改
os.statvfs()的参数为对应路径。