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()的参数为对应路径。