怎么用脚本获取内存配置

wen 实用脚本 1

自动化运维必备技能详解

目录导读

  1. 为什么需要脚本获取内存配置?
  2. 主流脚本语言获取内存配置方式对比
  3. Shell脚本实战:Linux系统内存配置采集
  4. Python脚本实战:跨平台内存数据分析
  5. PowerShell脚本:Windows服务器内存监控方案
  6. 内存配置脚本的常见问题与优化
  7. SEO优化视角:内存配置脚本的搜索价值
  8. 问答环节:开发者最关心的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.memsizevm_stat替代

3 大内存服务器精度

  • 问题:当内存超过2TB时,32位整数可能溢出
  • 方案:使用Python的decimal库或Shell的bc高精度计算

4 脚本性能优化

  • 减少系统调用:合并多个grep操作为一次awk处理
  • 缓存机制:短时间内的多次采集直接返回上次结果
  • 异步采集:对多台服务器使用Shell后台进程或Python多线程

SEO优化视角:内存配置脚本的搜索价值

从搜索引擎优化角度,本文覆盖以下高频搜索意图:

  • 导航意图:用户搜索“Linux 内存监控脚本下载”
  • 信息意图:用户搜索“怎么用Python获取内存使用率”
  • 事务意图:用户搜索“内存配置脚本 企业级” 策略要点公式**:动词+关键词+场景,如“怎么用脚本获取内存配置”
  1. H2/H3标签:每个实战部分都带小标题,符合SEO层级
  2. 内链价值:文中提及的扩展知识(如dmidecode详细用法)可做内链
  3. 代码片段:直观可复制的代码块能提升用户停留时间
  4. 问答环节:回答用户真实搜索问题,如“脚本获取内存配置速度慢怎么办?”

问答环节:开发者最关心的5个问题

Q1: Shell脚本获取内存配置时,free -m的used值为何与/proc/meminfo不一致?

A: free -mused列包含了buffers/cache,而MemAvailable才是真正可用的内存,推荐直接使用/proc/meminfo中的MemAvailable字段,它表示在不交换的情况下可分配的内存。

Q2: Python脚本在多台服务器批量采集时,速度太慢怎么办?

A: 可采用以下优化方案:

  • 使用asyncio异步IO并发SSH连接
  • 改用fabricansible远程执行库
  • 部署agent端采集,通过HTTP API统一上报

Q3: 如何判断内存配置脚本在Docker容器内是否可用?

A: 容器内只能读取到该容器的内存限制,而非宿主机总内存,可通过cat /sys/fs/cgroup/memory/memory.limit_in_bytes获取容器配额。

Q4: Windows Powershell和CMD相比,谁更适合获取内存配置?

A: PowerShell优先级更高,CMD依赖systeminfowmic,输出格式混乱且速度慢;而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最佳实践,覆盖从单机采集到集群监控的全场景需求。

抱歉,评论功能暂时关闭!