从入门到精通的完整指南
目录导读
- 为什么要用脚本获取系统关键信息?
- 核心脚本语言选择与基础准备
- 实战:用Python脚本获取CPU、内存、磁盘信息
- Windows与Linux系统脚本的差异
- 常见问题与解决方案(Q&A)
- 进阶:关键数据自动化上报与告警
- 总结与最佳实践
为什么要用脚本获取系统关键信息?
在日常运维与开发中,系统关键信息(如CPU使用率、内存占用、磁盘I/O、网络状态)直接影响服务稳定性,手动检查效率低下,且无法实时感知异常,通过脚本自动化采集,你可以:

- 一键获取多台服务器的核心指标
- 将数据写入监控系统(如Prometheus、Zabbix)
- 实现阈值触发告警(如CPU超90%自动通知)
问答:
Q:难道不能用top或htop命令看吗?
A:当然可以,但如果你有100台服务器呢?脚本能让你批量采集、持久化存储,并与其他系统集成。
核心脚本语言选择与基础准备
目前最流行的三种脚本语言对比:
- Python:跨平台、生态丰富(psutil库无敌)、适合复杂逻辑
- Shell:纯原生、执行效率高、适合简单采集
- PowerShell:Windows专属、与AD/Exchange集成强
建议:通用场景用Python,纯Linux环境用Shell。
基础准备:
- 安装Python 3.8+
- 安装psutil库:
pip install psutil - 确保脚本有执行权限:
chmod +x script.py
实战:用Python脚本获取CPU、内存、磁盘信息
以下是一个可直接运行的示例脚本,采集Windows/Linux共通的系统关键数据:
import psutil
import time
def get_system_info():
# CPU关键信息
cpu_percent = psutil.cpu_percent(interval=1)
cpu_count = psutil.cpu_count(logical=True)
# 内存关键信息
mem = psutil.virtual_memory()
mem_percent = mem.percent
mem_available = mem.available / (1024**3) # 转换为GB
# 磁盘关键信息
disk = psutil.disk_usage('/')
disk_percent = disk.percent
disk_free = disk.free / (1024**3)
# 网络关键信息(每秒字节数)
net_before = psutil.net_io_counters()
time.sleep(1)
net_after = psutil.net_io_counters()
net_sent = (net_after.bytes_sent - net_before.bytes_sent) / 1024
net_recv = (net_after.bytes_recv - net_before.bytes_recv) / 1024
return {
"cpu_percent": cpu_percent,
"cpu_cores": cpu_count,
"mem_percent": mem_percent,
"mem_available_gb": round(mem_available, 2),
"disk_percent": disk_percent,
"disk_free_gb": round(disk_free, 2),
"net_sent_kbps": round(net_sent, 2),
"net_recv_kbps": round(net_recv, 2)
}
if __name__ == "__main__":
info = get_system_info()
for key, value in info.items():
print(f"{key}: {value}")
输出示例:
cpu_percent: 45.3
cpu_cores: 8
mem_percent: 62.1
mem_available_gb: 6.25
disk_percent: 78.4
disk_free_gb: 42.1
net_sent_kbps: 156.2
net_recv_kbps: 234.8
这个脚本已经覆盖了数据库监控、Web服务器负载评估、可用资源分析的核心维度,你可以直接用于Zabbix agent自定义项,或配合crontab每5分钟执行一次。
Windows与Linux系统脚本的差异
虽然psutil屏蔽了大部分差异,但以下三点需要特别注意:
| 维度 | Windows | Linux |
|---|---|---|
| 磁盘路径 | 盘符如C:、D: | 挂载点如/、/home |
| 进程权限 | 需管理员权限访问部分关键进程 | 普通用户可读/proc |
| 网络接口名 | 可能含空格和特殊字符 | 通常为eth0、ens33 |
脚本适配技巧:
import platform
system = platform.system()
if system == "Windows":
disk_partitions = psutil.disk_partitions() # 会自动识别盘符
else:
disk_usage = psutil.disk_usage('/') # Linux根分区
问答:
Q:我的服务器是CentOS 7,脚本需要额外安装什么?
A:只需要pip install psutil,如果遇到gcc编译错误,先安装yum install python3-devel,建议用阿里云pip源加速:pip install -i https://mirrors.aliyun.com/pypi/simple/ psutil。
常见问题与解决方案(Q&A)
Q1:脚本报错No module named 'psutil'
A:确认你安装了正确的Python版本:python3 -m pip install psutil,如果同时有python2和3,请用python3显式调用。
Q2:CPU使用率一直是0%
A:这是因为你用的是psutil.cpu_percent(interval=0),必须设置大于0的interval时间(如1秒),否则返回0,VM虚拟机可能因CPU节流导致不准确。
Q3:磁盘空间提示与实际不符
A:检查是否使用了statvfs或df -h命令,脚本中的disk_usage('/')仅统计根分区,如果想统计所有分区,用循环遍历psutil.disk_partitions()。
Q4:网络采集数据波动太大
A:网络速率是瞬时值,建议取1秒内总量差(如脚本所示),或者采样3次取平均值,也可以用net_sent / interval公式规范化。
Q5:如何将结果输出为JSON用于API传输?
A:在脚本末尾添加import json; print(json.dumps(info, indent=2)),这样可以直接被REST接口或日志收集器解析。
进阶:关键数据自动化上报与告警
当获取到系统关键信息后,实际价值在于自动化响应,以下两个场景值得实践:
场景1:日志文件持久化
# crontab每5分钟执行一次 */5 * * * * /usr/bin/python3 /opt/scripts/sysinfo.py >> /var/log/sysinfo.json 2>&1
场景2:结合第三方监控平台(以Prometheus为例)
在脚本中追加HTTP服务模块,暴露/metrics端点:
from prometheus_client import start_http_server, Gauge
# 然后定义指标:cpu_gauge = Gauge('cpu_percent', 'Current CPU usage')
# 最后在采集循环中设置值
这样Prometheus server就能定期拉取,配合Grafana绘制实时仪表盘,大厂的生产环境通常采用这种agent + 拉取模式。
问答:
Q:我只有两台服务器,监控商业化方案太贵,能用脚本自己搭吗?
A:完全可以,用Python + Flask + Prometheus + Grafana(全部开源)就能搭建一套生产级监控,你的脚本需要做三件事:采集数据、生成Prometheus格式、启动HTTP服务,详细的搭建教程可以参考官方文档,关键词搜索“py process exporter”。
总结与最佳实践
通过本文,你已经掌握了用脚本获取系统关键信息的完整方法,总结要点:
- 优先使用Python的psutil库,它抽象了90%的跨平台差异
- 关键指标:CPU、内存、磁盘、网络是核心四大件
- 自动化思维:不要只手动跑,要结合cron、systemd、Docker等实现无人值守
- 安全第一:脚本不要明文写密码,用环境变量或加密配置文件
最佳实践清单:
- 所有脚本开头添加
#!/usr/bin/env python3和编码声明 - 使用
argparse模块支持命令行参数(如指定告警阈值) - 异常处理:用try-except捕获采集失败,避免脚本崩溃
- 日志记录:用logging库而非print,便于调试
- 持续优化:每季度检查一次脚本性能,避免内存泄漏
就动手在你的服务器上运行这个脚本吧,十分钟之后,你就能看到系统关键数据的实时快照,如果遇到问题,回到本文的Q&A部分查找,或者用pip安装rich库让输出彩色的表格,效果更酷。