自动化运维必备技能详解
目录导读
- 为什么需要脚本获取内存配置?
- 主流脚本语言获取内存配置方式对比
- Shell脚本实战:Linux系统内存配置采集
- Python脚本实战:跨平台内存数据分析
- PowerShell脚本:Windows服务器内存监控方案
- 内存配置脚本的常见问题与优化
- SEO优化视角:内存配置脚本的搜索价值
- 问答环节:开发者最关心的5个问题
为什么需要脚本获取内存配置?
在运维和开发工作中,自动化获取内存配置是基础设施监控、性能调优和故障排查的基础环节,手动执行free -m或查看任务管理器虽然能解决临时需求,但面对成百上千台服务器、定时巡检或容器化环境时,脚本化采集成为必然选择。

脚本获取内存配置的核心价值体现在:
- 批量管理:多台服务器同时采集,结果统一汇总
- 定时监控:通过crontab或Windows计划任务实现周期性采集
- 数据格式化:输出JSON/CSV格式,便于对接监控平台(如Zabbix、Prometheus)
- 异常告警:当内存使用率超过阈值时自动触发告警
SEO关键词提示:本文围绕“内存配置脚本”、“Linux内存监控脚本”、“Python获取内存信息”等长尾词展开,确保内容与搜索意图高度匹配。
主流脚本语言获取内存配置方式对比
| 脚本语言 | 适用平台 | 核心命令/库 | 优势场景 |
|---|---|---|---|
| Shell | Linux/Unix | free, cat /proc/meminfo, vmstat |
服务器端快速采集,资源占用低 |
| Python | 跨平台 | psutil, os.popen |
数据分析、图表生成、跨平台支持 |
| PowerShell | Windows | Get-WmiObject, Get-CimInstance |
Windows域环境批量管理 |
| Perl | Linux/Unix | Sys::MemInfo |
老旧系统兼容性需求 |
选择建议:如果是纯Linux运维场景,Shell脚本效率最高;需要跨平台或对接API时,Python更为灵活,Windows服务器建议优先使用PowerShell。
Shell脚本实战:Linux系统内存配置采集
1 基础脚本:获取总内存与使用率
#!/bin/bash
# 脚本功能:采集当前系统内存总量、已用量、可用量及使用率
# 适用于CentOS/Ubuntu/Debian等主流发行版
# 从 /proc/meminfo 读取关键指标
total=$(grep MemTotal /proc/meminfo | awk '{print $2}')
available=$(grep MemAvailable /proc/meminfo | awk '{print $2}')
used=$(( total - available ))
# 转换为MB(若追求可读性)
total_mb=$(( total / 1024 ))
available_mb=$(( available / 1024 ))
used_mb=$(( used / 1024 ))
# 计算使用率(保留两位小数)
usage=$(echo "scale=2; $used * 100 / $total" | bc)
# 格式化输出
echo "===================================="
echo " 内存配置采集时间:$(date '+%Y-%m-%d %H:%M:%S')"
echo " 总内存(MB):$total_mb"
echo " 已使用(MB):$used_mb"
echo " 可用内存(MB):$available_mb"
echo " 内存使用率(%):$usage"
echo "===================================="
2 进阶脚本:批量采集并输出JSON
#!/bin/bash
# 批量采集多个IP,输出JSON格式供监控平台消费
IP_LIST=("192.168.1.100" "192.168.1.101" "192.168.1.102")
SSH_USER="root"
SSH_KEY="/path/to/private_key"
for ip in "${IP_LIST[@]}"; do
result=$(ssh -i $SSH_KEY -o StrictHostKeyChecking=no $SSH_USER@$ip "
total=\$(grep MemTotal /proc/meminfo | awk '{print \$2}')
available=\$(grep MemAvailable /proc/meminfo | awk '{print \$2}')
used=\$(( total - available ))
usage=\$(echo \"scale=2; \$used * 100 / \$total\" | bc)
echo '{\"ip\":\"'$ip'\",\"total_kb\":'$total',\"used_kb\":'$used',\"available_kb\":'$available',\"usage_percent\":'$usage'}'
")
echo "$result"
done
脚本说明:该脚本通过SSH无密码登录远程服务器,采集后拼接为JSON字符串,非常适合对接监控API。
Python脚本实战:跨平台内存数据分析
Python因其丰富的第三方库,在内存配置获取上更具灵活性。psutil库是目前最推荐的方式,它封装了系统接口,无需解析文本。
1 安装依赖
pip install psutil
2 核心脚本:获取详细内存配置
#!/usr/bin/env python3
# encoding: utf-8
# 功能:获取系统内存完整信息,支持Linux/Windows/macOS
import psutil
import json
import datetime
def get_memory_info():
# 获取物理内存统计
mem = psutil.virtual_memory()
# 获取交换分区信息
swap = psutil.swap_memory()
memory_data = {
"timestamp": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"total_gb": round(mem.total / (1024**3), 2),
"available_gb": round(mem.available / (1024**3), 2),
"used_gb": round(mem.used / (1024**3), 2),
"usage_percent": mem.percent,
"swap_total_gb": round(swap.total / (1024**3), 2),
"swap_used_gb": round(swap.used / (1024**3), 2),
"swap_percent": swap.percent,
# 关键配置信息
"total_pages": mem.total // psutil.PAGE_SIZE, # 总页面数
"available_pages": mem.available // psutil.PAGE_SIZE
}
return memory_data
if __name__ == "__main__":
data = get_memory_info()
print(json.dumps(data, indent=2))
# 若需写入日志文件:
# with open("memory_snapshot.json", "a") as f:
# f.write(json.dumps(data) + "\n")
3 高级用法:获取内存条硬件配置(Linux)
如果需要获取物理内存条的数量、容量、频率等硬件信息,可以执行:
import subprocess
import re
def get_dimm_info():
result = subprocess.run(
["sudo", "dmidecode", "-t", "memory"],
capture_output=True, text=True
)
# 解析输出,提取每个DIMM槽的信息
dimms = []
current_dimm = {}
for line in result.stdout.split('\n'):
if 'Memory Device' in line:
if current_dimm:
dimms.append(current_dimm)
current_dimm = {}
elif 'Size:' in line and 'MB' in line:
current_dimm['size_mb'] = line.split(':')[1].strip()
elif 'Speed:' in line and 'MHz' in line:
current_dimm['speed'] = line.split(':')[1].strip()
elif 'Type:' in line and 'DDR' in line:
current_dimm['type'] = line.split(':')[1].strip()
if current_dimm:
dimms.append(current_dimm)
return dimms
注意:dmidecode需要root权限,生产环境可通过sudoers配置免密。
PowerShell脚本:Windows服务器内存监控方案
在Windows环境中,PowerShell是获取内存配置的官方推荐工具,以下脚本同时适用于Windows Server和Windows 10/11。
1 基础脚本:获取内存容量与使用率
# 获取物理内存总量(字节转GB) $totalMemory = (Get-CimInstance Win32_ComputerSystem).TotalPhysicalMemory / 1GB # 获取当前可用内存 $freeMemory = (Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory / 1MB $usedMemory = $totalMemory - ($freeMemory / 1024) $usagePercent = [math]::Round(($usedMemory / $totalMemory) * 100, 2) Write-Host "内存总量 (GB): $([math]::Round($totalMemory, 2))" Write-Host "已使用 (GB): $([math]::Round($usedMemory, 2))" Write-Host "可用 (MB): $([math]::Round($freeMemory, 2))" Write-Host "使用率 (%): $usagePercent"
2 高级脚本:导出CSV并配置定时任务
# 定义采集函数
function Get-MemoryReport {
param([string]$OutputPath)
$report = Get-CimInstance Win32_OperatingSystem | Select-Object @{
Name='Timestamp'; Expression={Get-Date -Format "yyyy-MM-dd HH:mm:ss"}
}, @{
Name='TotalMemoryGB'; Expression={[math]::Round($_.TotalVisibleMemorySize / 1MB, 2)}
}, @{
Name='FreeMemoryMB'; Expression={$_.FreePhysicalMemory}
}, @{
Name='UsedMemoryMB'; Expression={$_.TotalVisibleMemorySize - $_.FreePhysicalMemory}
}
$report | Export-Csv -Path $OutputPath -NoTypeInformation -Append
}
# 示例:每5分钟采集一次(需管理员权限运行)
while ($true) {
Get-MemoryReport -OutputPath "C:\Logs\memory_report.csv"
Start-Sleep -Seconds 300
}
配置定时任务:将此脚本保存为memory_monitor.ps1,然后在任务计划程序中创建触发器,频率设置为5分钟一次。
内存配置脚本的常见问题与优化
1 权限问题
- 问题:
dmidecode和/proc/meminfo在某些容器环境受限 - 方案:使用
/sys/devices/system/cpu/或free命令降级处理
2 跨平台兼容性
- 问题:
/proc/meminfo在macOS上不可用 - 方案:使用
sysctl hw.memsize或vm_stat替代
3 大内存服务器精度
- 问题:当内存超过2TB时,32位整数可能溢出
- 方案:使用Python的
decimal库或Shell的bc高精度计算
4 脚本性能优化
- 减少系统调用:合并多个
grep操作为一次awk处理 - 缓存机制:短时间内的多次采集直接返回上次结果
- 异步采集:对多台服务器使用Shell后台进程或Python多线程
SEO优化视角:内存配置脚本的搜索价值
从搜索引擎优化角度,本文覆盖以下高频搜索意图:
- 导航意图:用户搜索“Linux 内存监控脚本下载”
- 信息意图:用户搜索“怎么用Python获取内存使用率”
- 事务意图:用户搜索“内存配置脚本 企业级” 策略要点公式**:动词+关键词+场景,如“怎么用脚本获取内存配置”
- H2/H3标签:每个实战部分都带小标题,符合SEO层级
- 内链价值:文中提及的扩展知识(如
dmidecode详细用法)可做内链 - 代码片段:直观可复制的代码块能提升用户停留时间
- 问答环节:回答用户真实搜索问题,如“脚本获取内存配置速度慢怎么办?”
问答环节:开发者最关心的5个问题
Q1: Shell脚本获取内存配置时,free -m的used值为何与/proc/meminfo不一致?
A: free -m的used列包含了buffers/cache,而MemAvailable才是真正可用的内存,推荐直接使用/proc/meminfo中的MemAvailable字段,它表示在不交换的情况下可分配的内存。
Q2: Python脚本在多台服务器批量采集时,速度太慢怎么办?
A: 可采用以下优化方案:
- 使用
asyncio异步IO并发SSH连接 - 改用
fabric或ansible远程执行库 - 部署agent端采集,通过HTTP API统一上报
Q3: 如何判断内存配置脚本在Docker容器内是否可用?
A: 容器内只能读取到该容器的内存限制,而非宿主机总内存,可通过cat /sys/fs/cgroup/memory/memory.limit_in_bytes获取容器配额。
Q4: Windows Powershell和CMD相比,谁更适合获取内存配置?
A: PowerShell优先级更高,CMD依赖systeminfo或wmic,输出格式混乱且速度慢;而PowerShell的Get-CimInstance直接返回结构化对象,更适合脚本化处理。
Q5: 脚本获取的内存配置信息如何发送到监控系统?
A: 主流方案包括:
- Prometheus:输出
# HELP和# TYPE开头的文本格式 - Zabbix:通过
zabbix_sender发送trapper数据 - InfluxDB:直接POST JSON到写入API
- 文件落盘:CSV或JSON文件,再由Filebeat等采集
本文基于Linux、Windows和Python生态系统总结,综合了/proc/meminfo文档、psutil官方指南及PowerShell CIM最佳实践,覆盖从单机采集到集群监控的全场景需求。